﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using UFIDA.U8.MomServiceCommon;
using UFIDA.U8.U8MOMAPIFramework;
using UFIDA.U8.U8APIFramework;
using UFIDA.U8.U8APIFramework.Meta;
using UFIDA.U8.U8APIFramework.Parameter;
using MSXML2;
using Trade.DBUtility.DataTableName;

namespace YYAPI
{
    public class YongYouAPI
    {

        #region 委外订单生成到货单API
        /// <summary>
        /// 委外订单生成到货单API
        /// </summary>
        /// <param name="strYongYouDBName">UFDATA_999_2014</param>
        /// <param name="sAccID">999</param>
        /// <param name="sYear">2017</param>
        /// <param name="sUserID">demo</param>
        /// <param name="sPassword">demo</param>
        /// <param name="sDate">2017-08-19</param>
        /// <param name="sServer">127.0.0.1</param>
        /// <param name="strSHOrderNum">送货单号</param>
        /// <returns></returns>
        public string WWDHD(DataSet dsSHOrder, DataSet dsPDA, out string strPath, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strSHOrderNum, string strcwhcode, string strcwhname)
        {
            strPath = "";
            //string strYongYouDBName = "UFDATA_999_2014";
            //string sAccID = "999";
            //string sYear = "2015";
            //string sUserID = "demo";
            //string sPassword = "";
            //string sDate = "2015-02-01";
            //string sServer = "127.0.0.1";
            //string strSHOrderNum = this.tbSHOrderNum.Text;//"201708210001";
            //string strcwhcode = "";
            //string strcwhname = "";
            ////
            //string strRet = this.DHD(strYongYouDBName, sAccID, sYear, sUserID, sPassword, sDate, sServer, strSHOrderNum, strcwhcode, strcwhname);
            //MessageBox.Show(strRet, "完成");

            //判断是否已经搞过了
            string strISExists = "SELECT * FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch where isnull(cDefine5,0)='" + dsPDA.Tables["T_CGDH"].DefaultView[0]["ID"].ToString() + "'";
            DataSet dsISExists = new DataSet();
            try
            {
                dsISExists = CustomizableDesignBLL.GetData(strISExists);
            }
            catch (Exception ex)
            {
                return "判断送货单号已经做过到货单，出错：" + ex.Message;
            }
            if (dsISExists != null && dsISExists.Tables[0].DefaultView.Count > 0)
            {
                return "送货单号已经做过到货单";
            }
            //long lMaxCode = 0;
            //string strMAXCode = "select max(cCode) cCode FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch where ISNUMERIC(cCode)=1";
            //DataSet dsMaxCode = new DataSet();
            //try
            //{
            //    dsMaxCode = CustomizableDesignBLL.GetData(strMAXCode);
            //    if (dsMaxCode.Tables[0].DefaultView.Count > 0)
            //    {
            //        lMaxCode = Convert.ToInt64(dsMaxCode.Tables[0].DefaultView[0]["cCode"].ToString());
            //    }
            //}
            //catch (Exception ex)
            //{
            //    return "获取最大的到货单号出错：" + ex.Message;
            //}
            //strPath = "1";
            //lMaxCode++;
            //string strNewccode = lMaxCode.ToString("0000000000");//好像随便一个单号都可以的

            string strNewccode = "0000000001";//好像随便一个单号都可以的
            string strMAXCode = "select top 1 cCode FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch order by dDate";
            DataSet dsMaxCode = new DataSet();
            try
            {
                dsMaxCode = CustomizableDesignBLL.GetData(strMAXCode);
                if (dsMaxCode.Tables[0].DefaultView.Count > 0)
                {
                    strNewccode = dsMaxCode.Tables[0].DefaultView[0]["cCode"].ToString();
                }
            }
            catch (Exception ex)
            {
                return "获取最大的到货单号出错：" + ex.Message;
            }
            int ID = 0;// 1000000021;
            int iAutoID = 0;// 1000000034;
            strPath = "2";
            dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Sort = "SortID";
            string strDetailWhere = "";
            for (int i = 0; i < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; i++)
            {
                string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["WWDetail"].ToString();
                if (strID == string.Empty)
                    continue;
                if (strDetailWhere == "")
                    strDetailWhere = strID;
                else
                    strDetailWhere = strDetailWhere + " , " + strID;
            }
            if (strDetailWhere == "")
            {
                return "送货单明细信息的委外明细ID为空！";
            }
            //
            DataSet dsStock = new DataSet();
            List<DataTableName> dtnList = new List<DataTableName>();
            DataTableName dtn = new DataTableName();
            dtn.strSelectSQL = "select OM_MOMain.ccode ,\r\n" +
                               " CONVERT(VARCHAR(20), OM_MOMain.ddate, 23) 创建日期 ,\r\n" +
                               " OM_MODetails.iArrQTY,\r\n" +
                               " OM_MODetails.iTax 税额 ,\r\n" +
                               " OM_MOMain.MOID ,\r\n" +
                               " OM_MOMain.cvenpuomprotocol ,\r\n" +
                               " OM_MOMain.cBusType ,\r\n" +
                               " OM_MOMain.csccode ,\r\n" +
                               " OM_MOMain.cexch_name ,\r\n" +
                               " OM_MOMain.itaxrate ,\r\n" +
                               " OM_MOMain.nflat ,\r\n" +
                               " PurchaseType.cPTName ,\r\n" +
                               " OM_MODetails.MODetailsID DetailID ,\r\n" +
                               " hr_hi_person.cPsn_Name ,\r\n" +
                               " OM_MOMain.cVenCode 供应商编码 ,\r\n" +
                               " OM_MOMain.cdepcode,\r\n" +
                               " OM_MOMain.cptcode,\r\n" +
                               " OM_MOMain.cpersoncode,\r\n" +
                               " Department.cDepName 部门名称 ,\r\n" +
                               " vendor.cVenName 供应商名称 ,\r\n" +
                               " OM_MODetails.cInvCode 货号 ,\r\n" +
                               " inventory.cInvName 品名 ,\r\n" +
                               " inventory.cInvStd 规格 ,\r\n" +
                               " inventory.cInvCCode ,\r\n" +
                               " OM_MODetails.iQuantity 数量 ,\r\n" +
                               " OM_MODetails.iUnitPrice 不含税单价,\r\n" +
                               " OM_MODetails.iTaxPrice 含税单价,\r\n" +
                               " OM_MODetails.iPerTaxRate 税额,\r\n" +
                               " OM_MODetails.iNum 件数 ,\r\n" +
                               " OM_MODetails.iPerTaxRate,\r\n" +
                               " OM_MODetails.btaxcost,\r\n" +
                               " OM_MODetails.bgsp,\r\n" +
                               " ComputationUnit.cComUnitname 主单位 ,\r\n" +
                               " ComputationUnits.ichangrate,\r\n" +
                               " ComputationUnits.cComUnitname 辅计量单位 ,\r\n Inventory.cSAComUnitCode  CUNITID ," +
                               " Inventory.cDefWareHouse 仓库编码 ,\r\n" +
                               " Inventory.cInvDefine1,\r\n" +
                               " (SELECT cWhCode\r\n" +
                               "  from  " + strYongYouDBName + ".dbo.WareHouse\r\n" +
                                "  WHERE (cWhCode=Warehouse.cWhCode)  \r\n" +
                               " AND (case when ISNULL(dWhEndDate,'')='' then '9999-12-31' else dWhEndDate end) >  GETDATE()\r\n" +
                               " AND Warehouse.bProxyWh=0 \r\n" +
                               " and warehouse.bWhAsset<>1  \r\n" +
                               "  AND (bBondedWh = (select top 1 isnull(bbondedinv,0) \r\n" +
                               "  from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode) or \r\n" +
                               "  (select top 1 isnull(bbondedinv,0) \r\n" +
                                " from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode)='1'))  Warehouse_cWhCode ,\r\n" +
                               " (SELECT cWhName\r\n" +
                               "  from  " + strYongYouDBName + ".dbo.WareHouse\r\n" +
                                "  WHERE (cWhCode=Warehouse.cWhCode)  \r\n" +
                               " AND (case when ISNULL(dWhEndDate,'')='' then '9999-12-31' else dWhEndDate end) >  GETDATE()\r\n" +
                               " AND Warehouse.bProxyWh=0 \r\n" +
                               " and warehouse.bWhAsset<>1  \r\n" +
                               "  AND (bBondedWh = (select top 1 isnull(bbondedinv,0) \r\n" +
                               "  from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode) or \r\n" +
                               "  (select top 1 isnull(bbondedinv,0) \r\n" +
                                " from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode)='1')) Warehouse_cWhName,\r\n" +
                               " OM_MODetails.cFree2 公差 \r\n" +
                               " FROM " + strYongYouDBName + ".dbo.OM_MOMain OM_MOMain\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.OM_MODetails OM_MODetails ON OM_MOMain.MOID = OM_MODetails.MOID\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.vendor vendor ON OM_MOMain.cVenCode = vendor.cVenCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.Department Department ON OM_MOMain.cDepCode = Department.cDepCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.PurchaseType PurchaseType ON OM_MOMain.cptcode = PurchaseType.cptcode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.Inventory Inventory ON OM_MODetails.cInvCode = Inventory.cInvCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.ComputationUnit ComputationUnit ON Inventory.cComUnitCode = ComputationUnit.cComUnitCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.ComputationUnit ComputationUnits ON Inventory.cSAComUnitCode = ComputationUnits.cComUnitCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.hr_hi_person hr_hi_person ON OM_MOMain.cPersonCode = hr_hi_person.cPsn_Num\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.Warehouse Warehouse ON Inventory.cDefWareHouse = Warehouse.cWhCode\r\n" +
                                " where OM_MODetails.MODetailsID in (" + strDetailWhere + ")";
            dtn.strTableName = "table_1";
            dtnList.Add(dtn);
            try
            {
                dsStock = CustomizableDesignBLL.GetData(dtnList, false);
            }
            catch (Exception ex)
            {
                return "取委外订单的数据出错：" + ex.Message;
            }
            for (int i = 0; i < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; i++)
            {
                if (dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["WWDetail"] == DBNull.Value)
                {
                    return "T_SHOrderProduct第" + (i + 1).ToString() + "行相对应的委外订单ID为空！";
                }
                string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["WWDetail"].ToString();
                DataRow[] drWWSelectRow = dsStock.Tables[0].Select("DetailID='" + strID + "'");
                if (drWWSelectRow.Length == 0)
                {
                    return "第" + (i + 1).ToString() + "行相对应的委外订单不存在！";
                }
                //判断iArrQTY 是否等于 数量
                //decimal deciArrQTY = 0;
                //if (drWWSelectRow[0]["iArrQTY"] != DBNull.Value)
                //    deciArrQTY = Convert.ToDecimal(drWWSelectRow[0]["iArrQTY"].ToString());
                ////
                //decimal decQTY = 0;
                //if (drWWSelectRow[0]["数量"] != DBNull.Value)
                //    decQTY = Convert.ToDecimal(drWWSelectRow[0]["数量"].ToString());
                ////
                //decimal iquantity = 0;
                //if (dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["Quantity"] != DBNull.Value)
                //{
                //    iquantity = Convert.ToDecimal(dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["Quantity"].ToString());
                //}
                ////
                //if (deciArrQTY + iquantity > decQTY)
                //{
                //    return "第" + (i + 1).ToString() + "行的委外到货数量超出委外订单数量！";
                //}
            }
            //判断数量有没有超出
            foreach (DataRowView drv in dsStock.Tables[0].DefaultView)
            {
                int iDetailID = drv["DetailID"] == DBNull.Value ? 0 : Convert.ToInt32(drv["DetailID"].ToString());
                decimal deciQuantity = drv["数量"] == DBNull.Value ? 0 : Convert.ToDecimal(drv["数量"].ToString());
                decimal decfPoArrQuantity = drv["iArrQTY"] == DBNull.Value ? 0 : Convert.ToDecimal(drv["iArrQTY"].ToString());
                DataRow[] drSelectRows = dsSHOrder.Tables["T_SHOrderProduct"].Select("WWDetail=" + iDetailID.ToString());
                decimal decSHQuantity = 0;
                for (int i = 0; i < drSelectRows.Length; i++)
                {
                    decimal decQuantityTemp = drSelectRows[i]["Quantity"] == DBNull.Value ? 0 : Convert.ToDecimal(drSelectRows[i]["Quantity"].ToString());
                    decSHQuantity = decSHQuantity + decQuantityTemp;
                }
                decimal decChaoChuQty = deciQuantity - decfPoArrQuantity - decSHQuantity;
                decChaoChuQty = -decChaoChuQty;
                if (deciQuantity > decfPoArrQuantity + decSHQuantity)
                {
                    //return "存货代码" + drv["货号"].ToString() + "，订单数量" + deciQuantity.ToString("###,###,###,##0.00####") + "，已送货数量" + decfPoArrQuantity.ToString("###,###,###,##0.00####") + "，本次送货数量" + decSHQuantity.ToString("###,###,###,##0.00####") + "超出" + decChaoChuQty.ToString("###,###,###,##0.00####");
                }
            }
            strPath = "2.2";
            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //采购所有接口均支持内部独立事务和外部事务，默认内部事务
            //如果是外部事务，则需要传递ADO.Connection对象，并将IsIndependenceTransaction属性设置为false
            //envContext.BizDbConnection = new ADO.Connection();
            //envContext.IsIndependenceTransaction = false;

            //设置上下文参数
            envContext.SetApiContext("VoucherType", 2); //上下文数据类型：int，含义：单据类型， 采购到货单 2 
            envContext.SetApiContext("bPositive", true); //上下文数据类型：bool，含义：红蓝标识：True,蓝字；False,红字
            envContext.SetApiContext("sBillType", "0"); //上下文数据类型：string，含义：到货单类型， 到货单 0 退货单 1
            //envContext.SetApiContext("sBusType", "委外加工"); //cqz "普通采购" //上下文数据类型：string，含义：业务类型：普通采购,直运采购,受托代销
            envContext.SetApiContext("sBusType", dsStock.Tables[0].DefaultView[0]["cBusType"].ToString());

            //第三步：设置API地址标识(Url)
            //当前API：新增或修改的地址标识为：U8API/ArrivedGoods/VoucherSave
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ArrivedGoods/VoucherSave");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值
            //给BO表头参数DomHead赋值，此BO参数的业务类型为到货单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            strPath = "3";
            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            strPath = "";
            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = ID; //主关键字段，int类型
            DomHead[0]["cbustype"] = dsStock.Tables[0].DefaultView[0]["cBusType"].ToString(); //业务类型，int类型
            DomHead[0]["ccode"] = strNewccode; //单据号，string类型
            DomHead[0]["ddate"] = sDate; //日期，DateTime类型
            DomHead[0]["cvenabbname"] = dsStock.Tables[0].DefaultView[0]["供应商名称"].ToString(); //供应商，string类型 
            DomHead[0]["cdepname"] = dsStock.Tables[0].DefaultView[0]["部门名称"].ToString();  //部门，string类型 
            DomHead[0]["cexch_name"] = dsStock.Tables[0].DefaultView[0]["cexch_name"].ToString();  //币种，string类型
            decimal iexchrate = 0;
            if (dsStock.Tables[0].DefaultView[0]["nflat"] != DBNull.Value)
            {
                iexchrate = Convert.ToDecimal(dsStock.Tables[0].DefaultView[0]["nflat"].ToString()); //汇率，double类型
            }
            DomHead[0]["iexchrate"] = iexchrate; //汇率，double类型  
            //DomHead[0]["cflowname"] = ""; //流程模式描述，string类型
            //DomHead[0]["cchanger"] = ""; //变更人，string类型
            //if (dsStock.Tables[0].DefaultView[0]["iflowid"] != DBNull.Value)
            //    DomHead[0]["iflowid"] = dsStock.Tables[0].DefaultView[0]["iflowid"].ToString(); //cqz 流程ID，string类型
            //DomHead[0]["iflowid"] = "0";
            DomHead[0]["cpocode"] = dsStock.Tables[0].DefaultView[0]["ccode"].ToString(); //单号，string类型"201709071202051";// 
            //DomHead[0]["csysbarcode"] = ds.Tables["PU_ArrivalVouch"].DefaultView[0]["csysbarcode"].ToString();  //单据条码，string类型 cqz
            //DomHead[0]["csysbarcodepo"] = ""; //来源条形码，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            DateTime dtNow = DateTime.Now;
            DomHead[0]["cmaketime"] = dtNow.ToString("yyyy-MM-dd"); //制单时间，DateTime类型
            //DomHead[0]["cmodifytime"] = dtNow.ToString("yyyy-MM-dd"); //修改时间，DateTime类型
            //DomHead[0]["cmodifydate"] = dtNow.ToString("yyyy-MM-dd"); //修改日期，DateTime类型
            //DomHead[0]["creviser"] = sUserID; //修改人，string类型
            //DomHead[0]["caudittime"] = ""; //审核时间，DateTime类型
            //DomHead[0]["cauditdate"] = ""; //审核日期，DateTime类型
            //DomHead[0]["cptname"] = dsStock.Tables[0].DefaultView[0]["cPTName"].ToString(); //采购类型，string类型 
            //DomHead[0]["ccloser"] = ""; //关闭人，string类型
            DomHead[0]["iverifystateex"] = "0"; //审核状态，string类型
            //DomHead[0]["ireturncount"] = ""; //打回次数，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //是否启用工作流，string类型
            DomHead[0]["cpersonname"] = dsStock.Tables[0].DefaultView[0]["cPsn_Name"].ToString(); //业 务 员，string类型
            //DomHead[0]["cscname"] = dsStock.Tables[0].DefaultView[0]["pu_ArrHead_cscname"].ToString(); //cqz 运输方式，string类型
            decimal itaxrate = 0;
            if (dsStock.Tables[0].DefaultView[0]["itaxrate"] != DBNull.Value)
            {
                itaxrate = Convert.ToDecimal(dsStock.Tables[0].DefaultView[0]["itaxrate"].ToString()); //汇率，double类型
            }
            DomHead[0]["itaxrate"] = itaxrate.ToString(); //税率，double类型  
            //DomHead[0]["cmemo"] = dsStock.Tables[0].DefaultView[0]["cmemo"].ToString(); //备注，string类型
            DomHead[0]["cmaker"] = dsPDA.Tables[0].DefaultView[0]["CreaterName"].ToString(); ; //制单人，string类型
            DomHead[0]["ivtid"] = "8169"; //单据模版号，int类型
            //DomHead[0]["cverifier"] = ""; //审核人，string类型
            DomHead[0]["bnegative"] = "0"; //负发票标志，string类型
            DomHead[0]["cvencode"] = dsStock.Tables[0].DefaultView[0]["供应商编码"].ToString(); //供货单位编号，string类型
            DomHead[0]["cdepcode"] = dsStock.Tables[0].DefaultView[0]["cdepcode"].ToString(); //部门编号，string类型
            DomHead[0]["cptcode"] = dsStock.Tables[0].DefaultView[0]["cptcode"].ToString(); //采购类型编码，string类型
            //DomHead[0]["cpaycode"] = ""; //付款条件编码，string类型
            DomHead[0]["cpersoncode"] = dsStock.Tables[0].DefaultView[0]["cpersoncode"].ToString(); //职员编号，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["cpayname"] = ""; //付款条件，string类型
            //DomHead[0]["csccode"] = dsStock.Tables[0].DefaultView[0]["csccode"].ToString();//运输方式编码，string类型
            //strPath = strPath + "\r\n csccode" + dsStock.Tables[0].DefaultView[0]["csccode"].ToString();
            //DomHead[0]["cdefine1"] = dsStock.Tables[0].DefaultView[0]["cdefine1"].ToString();//cqz 表头自定义项1，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            DomHead[0]["cdefine5"] = dsPDA.Tables["T_CGDH"].DefaultView[0]["ID"].ToString(); //表头自定义项5，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            DomHead[0]["cdefine10"] = strSHOrderNum; //表头自定义项10，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["cvendefine1"] = ""; //供应商自定义项1，string类型
            //DomHead[0]["cvendefine2"] = ""; //供应商自定义项2，string类型
            //DomHead[0]["cvendefine3"] = ""; //供应商自定义项3，string类型
            //DomHead[0]["cvendefine4"] = ""; //供应商自定义项4，string类型
            //DomHead[0]["cvendefine5"] = ""; //供应商自定义项5，string类型
            //DomHead[0]["cvendefine6"] = ""; //供应商自定义项6，string类型
            //DomHead[0]["cvendefine7"] = ""; //供应商自定义项7，string类型
            //DomHead[0]["cvendefine8"] = ""; //供应商自定义项8，string类型
            //DomHead[0]["cvendefine9"] = ""; //供应商自定义项9，string类型
            //DomHead[0]["cvendefine10"] = ""; //供应商自定义项10，string类型
            //DomHead[0]["cvendefine11"] = ""; //供应商自定义项11，string类型
            //DomHead[0]["cvendefine12"] = ""; //供应商自定义项12，string类型
            //DomHead[0]["cvendefine13"] = ""; //供应商自定义项13，string类型
            //DomHead[0]["cvendefine14"] = ""; //供应商自定义项14，string类型
            //DomHead[0]["cvendefine15"] = ""; //供应商自定义项15，string类型
            //DomHead[0]["cvendefine16"] = ""; //供应商自定义项16，string类型
            DomHead[0]["idiscounttaxtype"] = "0"; //扣税类别，int类型
            DomHead[0]["ibilltype"] = "0"; //单据类型，int类型
            DomHead[0]["cvenpuomprotocol"] = dsStock.Tables[0].DefaultView[0]["cvenpuomprotocol"].ToString(); //收付款协议编码，string类型
            //DomHead[0]["cvenpuomprotocolname"] = ""; //收付款协议名称，string类型

            //strPath = "4";
            //给BO表体参数domBody赋值，此BO参数的业务类型为到货单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = dsStock.Tables[0].DefaultView.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            for (int iRow = 0; iRow < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; iRow++)
            {
                string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["WWDetail"].ToString();
                DataRow[] drSelectRowsStock = dsStock.Tables[0].Select("DetailID='" + strID + "'");
                if (drSelectRowsStock.Length == 0)
                    continue;
                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = iAutoID + 1; //主关键字段，int类型 
                domBody[iRow]["cinvcode"] = drSelectRowsStock[0]["货号"].ToString(); //存货编码，string类型
                //
                decimal iquantity = 0;
                string strSerialID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["SerialID"].ToString();
                //获取PDA表里面的修改数量
                DataRow[] drSlectPDA = dsPDA.Tables["T_CGDHProduct"].Select("SHSerialID='" + strSerialID + "'");
                //
                if (drSlectPDA.Length > 0)
                {
                    if (drSlectPDA[0]["Quantity"] != DBNull.Value)
                        iquantity = Convert.ToDecimal(drSlectPDA[0]["Quantity"].ToString());
                }
                //iquantity = 0.01M;//估计是用友API的BUG，然后通过SQL回刷数量
                domBody[iRow]["iquantity"] = iquantity.ToString(); //主计量数量，double类型
                //
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                domBody[iRow]["ivouchrowno"] = (iRow + 1).ToString(); //行号，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，string类型
                //domBody[iRow]["cbmemo"] = drSelectRowsStock[0]["cbmemo"].ToString(); //cqz 备注，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型 cqz
                //domBody[iRow]["carrivalcode"] = ""; //到货单号，string类型
                //domBody[iRow]["irejectautoid"] = ""; //irejectautoid，string类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，string类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，string类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，string类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型
                //if (drSelectRowsStock[0]["cInvCCode"].ToString() == "030102" || drSelectRowsStock[0]["cInvCCode"].ToString() == "030202")
                //{
                //    domBody[iRow]["cbatchproperty8"] = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["LuNo"].ToString();  //批次属性8，string类型
                //}
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，string类型
                //domBody[iRow]["isourcemocode"] = ""; //源订单号，string类型
                //domBody[iRow]["isourcemodetailsid"] = ""; //源订单子表ID，string类型
                //domBody[iRow]["freworkquantity"] = ""; //返工数量，string类型
                //domBody[iRow]["freworknum"] = ""; //返工件数，string类型
                domBody[iRow]["iproducttype"] = "0"; //cqz产出品类型，string类型
                //domBody[iRow]["cmaininvcode"] = ""; //主产品存货编码，string类型
                //domBody[iRow]["imainmodetailsid"] = ""; //主产品订单子表ID，string类型
                //domBody[iRow]["planlotnumber"] = ""; //计划批号，string类型
                domBody[iRow]["bgift"] = "0"; //赠品，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型

                /***************************** 以下是非必输字段 ****************************/
                //domBody[iRow]["cinvstd"] = drSelectRowsStock[0]["规格"].ToString(); //规格型号，string类型
                //
                decimal iinvexchrate = 0;
                if (drSelectRowsStock[0]["ichangrate"] != DBNull.Value)
                {
                    iinvexchrate = Convert.ToDecimal(drSelectRowsStock[0]["ichangrate"].ToString());
                }
                domBody[iRow]["iinvexchrate"] = iinvexchrate.ToString(); //换算率，double类型
                //
                decimal inum = 0;
                if (iinvexchrate != 0)
                {
                    inum = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity / iinvexchrate, 2);
                }
                inum = 0;
                domBody[iRow]["inum"] = inum.ToString(); //件数，double类型
                //
                itaxrate = 0;
                if (drSelectRowsStock[0]["iPerTaxRate"] != DBNull.Value)
                {
                    itaxrate = Convert.ToDecimal(drSelectRowsStock[0]["iPerTaxRate"].ToString());
                }
                domBody[iRow]["itaxrate"] = itaxrate.ToString(); //税率，double类型
                //
                decimal ioricost = 0;
                if (drSelectRowsStock[0]["不含税单价"] != DBNull.Value)
                {
                    ioricost = Convert.ToDecimal(drSelectRowsStock[0]["不含税单价"].ToString());
                }
                domBody[iRow]["ioricost"] = ioricost.ToString(); //原币单价，double类型
                //
                decimal iorimoney = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity * ioricost, 2);
                domBody[iRow]["iorimoney"] = iorimoney.ToString(); //原币金额，double类型
                //
                decimal ioritaxprice = Trade.DBUtility.Common.decimalEx.RoundEx(iorimoney * itaxrate / 100, 2);
                domBody[iRow]["ioritaxprice"] = ioritaxprice.ToString(); //原币税额，double类型
                //
                decimal icost = 0;
                if (drSelectRowsStock[0]["不含税单价"] != DBNull.Value)
                {
                    icost = Convert.ToDecimal(drSelectRowsStock[0]["不含税单价"].ToString());
                }
                domBody[iRow]["icost"] = icost.ToString(); //本币单价，double类型
                //
                decimal imoney = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity * icost, 2);
                domBody[iRow]["imoney"] = imoney.ToString(); //本币金额，double类型
                //
                decimal itaxprice = Trade.DBUtility.Common.decimalEx.RoundEx(imoney * itaxrate / 100, 2);
                domBody[iRow]["itaxprice"] = itaxprice.ToString(); //本币税额，double类型
                //
                decimal isum = imoney + itaxprice;
                domBody[iRow]["isum"] = isum.ToString(); //本币价税合计，double类型
                //
                //domBody[iRow]["cinvdefine1"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine1"].ToString(); //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine4"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine4"].ToString();  //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine5"].ToString();  //存货自定义项5，string类型
                //domBody[iRow]["cfree1"] = drSelectRowsStock[0]["cfree1"].ToString(); //自由项1，string类型
                //domBody[iRow]["cinvdefine6"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine6"].ToString(); //存货自定义项6，string类型
                // domBody[iRow]["cfree2"] = drSelectRowsStock[0]["公差"].ToString();//自由项2，string类型
                //domBody[iRow]["cinvdefine7"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine7"].ToString(); //存货自定义项7，string类型
                decimal iorisum = iorimoney + ioritaxprice;
                domBody[iRow]["iorisum"] = iorisum.ToString(); //原币价税合计，double类型
                //domBody[iRow]["cinvdefine8"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine8"].ToString(); //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine9"].ToString();//存货自定义项9，string类型
                //domBody[iRow]["cdefine22"] = drSelectRowsStock[0]["cdefine22"].ToString();//表体自定义项1，string类型
                //domBody[iRow]["cinvdefine10"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine10"].ToString(); //存货自定义项10，string类型
                //domBody[iRow]["cdefine23"] = drSelectRowsStock[0]["cdefine23"].ToString();//表体自定义项2，string类型
                //domBody[iRow]["cinvdefine11"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine11"].ToString(); //存货自定义项11，string类型
                //domBody[iRow]["cdefine24"] = drSelectRowsStock[0]["cdefine24"].ToString(); //表体自定义项3，string类型
                //domBody[iRow]["cinvdefine12"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine12"].ToString(); //存货自定义项12，string类型
                //domBody[iRow]["cdefine25"] = drSelectRowsStock[0]["cdefine25"].ToString(); //表体自定义项4，string类型
                //domBody[iRow]["cinvdefine13"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine13"].ToString(); //存货自定义项13，string类型
                //
                //decimal cdefine26 = 0;
                //if (drSelectRowsStock[0]["cdefine26"] != DBNull.Value)
                //{
                //    cdefine26 = Convert.ToDecimal(drSelectRowsStock[0]["cdefine26"].ToString());
                //}
                //domBody[iRow]["cdefine26"] = cdefine26.ToString(); //表体自定义项5，double类型
                ////
                //domBody[iRow]["cinvdefine14"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine14"].ToString(); //存货自定义项14，string类型
                ////
                //decimal cdefine27 = 0;
                //if (drSelectRowsStock[0]["cdefine27"] != DBNull.Value)
                //{
                //    cdefine27 = Convert.ToDecimal(drSelectRowsStock[0]["cdefine27"].ToString());
                //}
                //domBody[iRow]["cdefine27"] = cdefine27.ToString(); //表体自定义项6，double类型
                ////
                //domBody[iRow]["cinvdefine15"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine15"].ToString(); //存货自定义项15，string类型

                ////
                //domBody[iRow]["cinvdefine16"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine16"].ToString(); //存货自定义项16，string类型
                //domBody[iRow]["citemcode"] = drSelectRowsStock[0]["citemcode"].ToString();//项目编码，string类型
                //domBody[iRow]["cinvdefine2"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine3"].ToString(); //存货自定义项2，string类型
                //domBody[iRow]["citem_class"] = drSelectRowsStock[0]["citem_class"].ToString();//项目大类编码，string类型
                //domBody[iRow]["cinvdefine3"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine3"].ToString(); //存货自定义项3，string类型

                //bug 
                //domBody[iRow]["iposid"] = strID; //订单子表ID，int类型
                //

                //domBody[iRow]["citemname"] = drSelectRowsStock[0]["citemname"].ToString();//项目名称，string类型
                //domBody[iRow]["citem_name"] = drSelectRowsStock[0]["pu_ArrBody_citem_name"].ToString(); //项目大类名称，string类型
                //domBody[iRow]["cfree3"] = drSelectRowsStock[0]["cfree3"].ToString();  //自由项3，string类型
                //domBody[iRow]["cfree4"] = drSelectRowsStock[0]["cfree4"].ToString();  //自由项4，string类型
                //domBody[iRow]["cfree5"] = drSelectRowsStock[0]["cfree5"].ToString();  //自由项5，string类型
                //domBody[iRow]["cfree6"] = drSelectRowsStock[0]["cfree6"].ToString();  //自由项6，string类型
                //domBody[iRow]["cfree7"] = drSelectRowsStock[0]["cfree7"].ToString();  //自由项7，string类型
                //domBody[iRow]["cfree8"] = drSelectRowsStock[0]["cfree8"].ToString();  //自由项8，string类型
                //domBody[iRow]["cfree9"] = drSelectRowsStock[0]["cfree9"].ToString();  //自由项9，string类型
                //domBody[iRow]["cfree10"] = drSelectRowsStock[0]["cfree10"].ToString();  //自由项10，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                domBody[iRow]["cunitid"] = drSelectRowsStock[0]["CUNITID"].ToString(); //单位编码，string类型
                //domBody[iRow]["cinva_unit"] = drSelectRowsStock[0]["pu_ArrBody_cinva_unit"].ToString();//采购单位，string类型
                //domBody[iRow]["cinvm_unit"] = drSelectRowsStock[0]["pu_ArrBody_cinvm_unit"].ToString();//主计量，string类型
                //domBody[iRow]["igrouptype"] = drSelectRowsStock[0]["pu_ArrBody_igrouptype"].ToString(); //分组类型，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                domBody[iRow]["cdefine34"] = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["SerialID"].ToString(); //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //
                decimal ioritaxcost = 0;
                if (drSelectRowsStock[0]["含税单价"] != DBNull.Value)
                {
                    ioritaxcost = Convert.ToDecimal(drSelectRowsStock[0]["含税单价"].ToString());
                }
                domBody[iRow]["ioritaxcost"] = ioritaxcost.ToString(); //含税单价，double类型
                //
                //domBody[iRow]["icorid"] = ""; //到货单子表id，int类型
                //domBody[iRow]["cbatch"] = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["BatchNO"].ToString();//批号，string类型
                //domBody[iRow]["dpdate"] = ""; //生产日期，DateTime类型
                //domBody[iRow]["dvdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //
                int bgsp = 0;
                if (drSelectRowsStock[0]["bgsp"] != DBNull.Value)
                {
                    bgsp = Convert.ToInt32(drSelectRowsStock[0]["bgsp"].ToString());
                }
                domBody[iRow]["bgsp"] = bgsp.ToString(); //是否检验，int类型
                domBody[iRow]["id"] = ID; //主表id，int类型
                domBody[iRow]["cwhcode"] = strcwhcode;//cqz 仓库编码，string类型
                //domBody[iRow]["cwhname"] = drSelectRowsStock[0]["Warehouse_cWhName"].ToString();//cqz 仓库名称，string类型
                //domBody[iRow]["cinvname"] = drSelectRowsStock[0]["品名"].ToString();//存货名称，string类型
                int btaxcost = 0;
                if (drSelectRowsStock[0]["btaxcost"] != DBNull.Value)
                {
                    if ((bool)drSelectRowsStock[0]["btaxcost"])
                    {
                        btaxcost = 1;
                    }
                    else
                    {
                        btaxcost = 0;
                    }
                }
                domBody[iRow]["btaxcost"] = btaxcost.ToString(); //单价标准，string类型
                //domBody[iRow]["binspect"] = ""; //是否已报检，int类型
                //domBody[iRow]["fvalidquantity"] = ""; //合格数量，double类型
                //domBody[iRow]["finvalidquantity"] = ""; //不合格数量，double类型
                //domBody[iRow]["frefusequantity"] = ""; //拒收数量，double类型
                //domBody[iRow]["cinvaddcode"] = ""; //存货代码，string类型
                //domBody[iRow]["frefusenum"] = ""; //拒收件数，double类型
                //domBody[iRow]["cveninvcode"] = ""; //供应商存货编码，string类型
                //domBody[iRow]["cveninvname"] = ""; //供应商存货名称，string类型
                //domBody[iRow]["bexigency"] = "0"; //是否急料，int类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["ippartid"] = ""; //母件Id，int类型
                //domBody[iRow]["ipquantity"] = ""; //母件数量，int类型
                //domBody[iRow]["iptoseq"] = ""; //选配序号，int类型
                domBody[iRow]["cordercode"] = drSelectRowsStock[0]["ccode"].ToString();//订单号，string类型
                //domBody[iRow]["contractrowno"] = drSelectRowsStock[0]["contractrowno"].ToString();//合同标的编码，string类型
                //domBody[iRow]["contractrowguid"] = drSelectRowsStock[0]["contractrowguid"].ToString();//合同标的GUID，string类型
                //domBody[iRow]["contractcode"] = drSelectRowsStock[0]["contractcode"].ToString();//合同号，string类型
                domBody[iRow]["sotype"] = "0"; //需求跟踪方式，int类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["irowno"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["sodid"] = ""; //需求跟踪子表ID，string类型
                //domBody[iRow]["frealquantity"] = ""; //实收数量，double类型
                //domBody[iRow]["frealnum"] = ""; //实收件数，double类型
                //domBody[iRow]["fsumrefusequantity"] = ""; //已拒收数量，double类型
                //domBody[iRow]["fsumrefusenum"] = ""; //已拒收件数，double类型
                //domBody[iRow]["fvalidnum"] = ""; //合格件数，double类型
                domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，DateTime类型
                //domBody[iRow]["cbcloser"] = ""; //行关闭人，string类型
                //domBody[iRow]["dValidateDate"] = ""; //有效期，string类型
                //domBody[iRow]["iinvmpcost"] = ""; //最高进价，double类型
                //domBody[iRow]["cupsocode"] = ""; //不良品处理单号，string类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型
                //domBody[iRow]["iorderdid"] = ""; //销售订单子表id ，int类型
                domBody[iRow]["iordertype"] = "0"; //销售订单类型 ，int类型
                //domBody[iRow]["csoordercode"] = ""; //销售订单号 ，string类型
                //domBody[iRow]["iorderseq"] = ""; //销售订单行号 ，int类型
            }
            //给普通参数VoucherState赋值。此参数的数据类型为int，此参数按值传递，表示单据状态：2新增，1修改，0非编辑
            broker.AssignNormalValue("VoucherState", 2);

            //该参数curID为OUT型参数，由于其数据类型为string，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("curID")获取其值

            //该参数CurDom为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 CurDom = new MSXML2.DOMDocument();
            broker.AssignNormalValue("CurDom", CurDom);

            //给普通参数UserMode赋值。此参数的数据类型为int，此参数按值传递，表示模式，0：CS;1:BS
            broker.AssignNormalValue("UserMode", 0);

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strRetMsg = "";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRetMsg = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRetMsg = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRetMsg = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRetMsg;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.String，此参数按值传递，表示错误描述：空，正确；非空，错误
            System.String result = broker.GetReturnValue() as System.String;
            if (result != null && result != string.Empty)
            {
                broker.Release();
                return "失败！" + result;
            }
            //获取out/inout参数值

            //获取普通OUT参数curID。此返回值数据类型为string，在使用该参数之前，请判断是否为空
            string curIDRet = broker.GetResult("curID") as string;

            //获取普通OUT参数CurDom。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 CurDomRet = Convert.ToObject(broker.GetResult("CurDom"));

            //结束本次调用，释放API资源
            broker.Release();
            #region 不知道是不是用友的API存在BUG，委外到货单的数量就是会提示超出，本次只写入0.01数量，然后通过SQL刷新到货数量和委外订单的已到货数量
            DataSet dsWWOrder = new DataSet();
            DataTableName dtnWW = new DataTableName();
            dtnWW.strSelectSQL = "select * from " + strYongYouDBName + ".dbo.PU_ArrivalVouchs where id in (select id from " + strYongYouDBName + ".dbo.PU_ArrivalVouch where isnull(cDefine5,0)='" + dsPDA.Tables["T_CGDH"].DefaultView[0]["ID"].ToString() + "')";
            dtnWW.strSaveSQL = "select * from " + strYongYouDBName + ".dbo.PU_ArrivalVouchs";
            dtnWW.strTableName = "PU_ArrivalVouchs";
            //
            try
            {
                dsWWOrder = CustomizableDesignBLL.GetData(dtnWW, true);
            }
            catch (Exception ex)
            {
                return "刷新委外到货单的数量出错:" + ex.Message;
            }
            for (int iRow = 0; iRow < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; iRow++)
            {
                DataRow[] drSelectRows = dsWWOrder.Tables[0].Select("cdefine34=" + dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["SerialID"].ToString());
                if (drSelectRows.Length == 0)
                {
                    return "刷新委外到货单的数量出错:第" + (iRow + 1).ToString() + "行没有找到";
                }
                string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["WWDetail"].ToString();
                DataRow[] drSelectRowsStock = dsStock.Tables[0].Select("DetailID='" + strID + "'");
                if (drSelectRowsStock.Length == 0)
                {
                    return "刷新委外到货单的数量出错:第" + (iRow + 1).ToString() + "行没有找到到货单";
                }
                drSelectRows[0]["iposid"] = strID;
                //decimal iquantity = 0;
                //if (dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["Quantity"] != DBNull.Value)
                //{
                //    iquantity = Convert.ToDecimal(dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["Quantity"].ToString());
                //}
                //drSelectRows[0]["iquantity"] = iquantity.ToString(); //主计量数量，double类型
                ////
                //decimal iinvexchrate = 0;
                //if (drSelectRowsStock[0]["ichangrate"] != DBNull.Value)
                //{
                //    iinvexchrate = Convert.ToDecimal(drSelectRowsStock[0]["ichangrate"].ToString());
                //}
                //drSelectRows[0]["iinvexchrate"] = iinvexchrate.ToString(); //换算率，double类型
                ////
                //decimal inum = 0;
                //if (iinvexchrate != 0)
                //{
                //    inum = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity / iinvexchrate, 2);
                //}
                //inum = 0;
                //drSelectRows[0]["inum"] = inum.ToString(); //件数，double类型
                ////
                //itaxrate = 0;
                //if (drSelectRowsStock[0]["iPerTaxRate"] != DBNull.Value)
                //{
                //    itaxrate = Convert.ToDecimal(drSelectRowsStock[0]["iPerTaxRate"].ToString());
                //}
                //drSelectRows[0]["itaxrate"] = itaxrate.ToString(); //税率，double类型
                ////
                //decimal ioricost = 0;
                //if (drSelectRowsStock[0]["不含税单价"] != DBNull.Value)
                //{
                //    ioricost = Convert.ToDecimal(drSelectRowsStock[0]["不含税单价"].ToString());
                //}
                //drSelectRows[0]["ioricost"] = ioricost.ToString(); //原币单价，double类型
                ////
                //decimal iorimoney = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity * ioricost, 2);
                //drSelectRows[0]["iorimoney"] = iorimoney.ToString(); //原币金额，double类型
                ////
                //decimal ioritaxprice = Trade.DBUtility.Common.decimalEx.RoundEx(iorimoney * itaxrate / 100, 2);
                //drSelectRows[0]["ioritaxprice"] = ioritaxprice.ToString(); //原币税额，double类型
                ////
                //decimal icost = 0;
                //if (drSelectRowsStock[0]["不含税单价"] != DBNull.Value)
                //{
                //    icost = Convert.ToDecimal(drSelectRowsStock[0]["不含税单价"].ToString());
                //}
                //drSelectRows[0]["icost"] = icost.ToString(); //本币单价，double类型
                ////
                //decimal imoney = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity * icost, 2);
                //drSelectRows[0]["imoney"] = imoney.ToString(); //本币金额，double类型
                ////
                //decimal itaxprice = Trade.DBUtility.Common.decimalEx.RoundEx(imoney * itaxrate / 100, 2);
                //drSelectRows[0]["itaxprice"] = itaxprice.ToString(); //本币税额，double类型
                ////
                //decimal isum = imoney + itaxprice;
                //drSelectRows[0]["isum"] = isum.ToString(); //本币价税合计，double类型
                ////
                //decimal iorisum = iorimoney + ioritaxprice;
                //drSelectRows[0]["iorisum"] = iorisum.ToString(); //原币价税合计，double类型
                ////
                //decimal ioritaxcost = 0;
                //if (drSelectRowsStock[0]["含税单价"] != DBNull.Value)
                //{
                //    ioritaxcost = Convert.ToDecimal(drSelectRowsStock[0]["含税单价"].ToString());
                //}
                //drSelectRows[0]["ioritaxcost"] = ioritaxcost.ToString(); //含税单价，double类型
                //仓库编码
                drSelectRows[0]["cWhCode"] = strcwhcode;//drSelectRowsStock[0]["仓库编码"].ToString();
                //
                drSelectRows[0].EndEdit();
                //生成更新语句,iNatArrMoney为本币，ori开头的是原币
                DataTableName.SaveAfterSQL sql = new DataTableName.SaveAfterSQL();
                sql.strSQL = "update " + strYongYouDBName + ".dbo.OM_MOdetails \r\n" +
                            "set iArrQTY=(select sum(iquantity) from " + strYongYouDBName + ".dbo.PU_ArrivalVouchs PU_ArrivalVouchs LEFT JOIN " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch ON PU_ArrivalVouch.id=PU_ArrivalVouchS.id where PU_ArrivalVouch.CBUSTYPE='委外加工' and PU_ArrivalVouchs.iposid=" + strID + "),\r\n" +
                                "iArrNum=(select sum(inum) from " + strYongYouDBName + ".dbo.PU_ArrivalVouchs PU_ArrivalVouchs LEFT JOIN " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch ON PU_ArrivalVouch.id=PU_ArrivalVouchS.id where PU_ArrivalVouch.CBUSTYPE='委外加工' and PU_ArrivalVouchs.iposid=" + strID + "),\r\n" +
                    //原币
                                "iArrMoney=(select sum(iorisum) from " + strYongYouDBName + ".dbo.PU_ArrivalVouchs PU_ArrivalVouchs LEFT JOIN " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch ON PU_ArrivalVouch.id=PU_ArrivalVouchS.id where PU_ArrivalVouch.CBUSTYPE='委外加工' and PU_ArrivalVouchs.iposid=" + strID + "),\r\n" +
                    //本币
                                "iNatArrMoney=(select sum(isum) from " + strYongYouDBName + ".dbo.PU_ArrivalVouchs PU_ArrivalVouchs LEFT JOIN " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch ON PU_ArrivalVouch.id=PU_ArrivalVouchS.id where PU_ArrivalVouch.CBUSTYPE='委外加工' and PU_ArrivalVouchs.iposid=" + strID + ")\r\n" +
                                "where modetailsID=" + strID;
                dtnWW.SaveAfterSQLList.Add(sql);
            }
            DataTableName.SaveAfterSQL sql1 = new DataTableName.SaveAfterSQL();
            sql1.strSQL = "update " + strYongYouDBName + ".dbo.PU_ArrivalVouch\r\n" +
                            "set cmaker=(select top 1 cUser_Name from UFSystem.dbo.UA_User where cuser_id='" + sUserID + "')\r\n" +
                                "where isnull(cDefine5,0)='" + dsPDA.Tables["T_CGDH"].DefaultView[0]["ID"].ToString() + "'";
            dtnWW.SaveAfterSQLList.Add(sql1);
            //保存
            try
            {
                if (dsWWOrder.GetChanges() != null)
                    CustomizableDesignBLL.SaveData(dsWWOrder.GetChanges(), dtnWW);
            }
            catch (Exception ex)
            {
                return "保存委外到货单的数量出错:" + ex.Message;
            }
            #endregion
            return "";
        }
        #endregion
        #region 采购订单生成到货单API
        /// <summary>
        /// 采购订单生成到货单API
        /// </summary>
        /// <param name="strYongYouDBName">UFDATA_999_2014</param>
        /// <param name="sAccID">999</param>
        /// <param name="sYear">2017</param>
        /// <param name="sUserID">demo</param>
        /// <param name="sPassword">demo</param>
        /// <param name="sDate">2017-08-19</param>
        /// <param name="sServer">127.0.0.1</param>
        /// <param name="strSHOrderNum">送货单号</param>
        /// <returns></returns>
        public string DHD(DataSet dsSHOrder, DataSet dsPDA, out string strPath, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strSHOrderNum, string strcwhcode, string strcwhname)
        {
            strPath = "";
            //string strYongYouDBName = "UFDATA_999_2014";
            //string sAccID = "999";
            //string sYear = "2015";
            //string sUserID = "demo";
            //string sPassword = "";
            //string sDate = "2015-02-01";
            //string sServer = "127.0.0.1";
            //string strSHOrderNum = this.tbSHOrderNum.Text;//"201708210001";
            //string strcwhcode = "";
            //string strcwhname = "";
            ////
            //string strRet = this.DHD(strYongYouDBName, sAccID, sYear, sUserID, sPassword, sDate, sServer, strSHOrderNum, strcwhcode, strcwhname);
            //MessageBox.Show(strRet, "完成");

            //判断是否已经搞过了
            string strISExists = "SELECT * FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch where isnull(cDefine5,0)='" + dsPDA.Tables["T_CGDH"].DefaultView[0]["ID"].ToString() + "'";
            DataSet dsISExists = new DataSet();
            try
            {
                dsISExists = CustomizableDesignBLL.GetData(strISExists);
            }
            catch (Exception ex)
            {
                return "判断送货单号已经做过到货单，出错：" + ex.Message;
            }
            if (dsISExists != null && dsISExists.Tables[0].DefaultView.Count > 0)
            {
                return "送货单号已经做过到货单";
            }
            //long lMaxCode = 0;
            //string strMAXCode = "select max(cCode) cCode FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch where ISNUMERIC(cCode)=1";
            //DataSet dsMaxCode = new DataSet();
            //try
            //{
            //    dsMaxCode = CustomizableDesignBLL.GetData(strMAXCode);
            //    if (dsMaxCode.Tables[0].DefaultView.Count > 0)
            //    {
            //        lMaxCode = Convert.ToInt64(dsMaxCode.Tables[0].DefaultView[0]["cCode"].ToString());
            //    }
            //}
            //catch(Exception ex)
            //{
            //    return "获取最大的到货单号出错：" + ex.Message;
            //}
            //strPath = "1";
            //lMaxCode++;
            //string strNewccode = lMaxCode.ToString("0000000000");//好像随便一个单号都可以的

            string strNewccode = "0000000001";//好像随便一个单号都可以的
            string strMAXCode = "select top 1 cCode FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch order by dDate";
            DataSet dsMaxCode = new DataSet();
            try
            {
                dsMaxCode = CustomizableDesignBLL.GetData(strMAXCode);
                if (dsMaxCode.Tables[0].DefaultView.Count > 0)
                {
                    strNewccode = dsMaxCode.Tables[0].DefaultView[0]["cCode"].ToString();
                }
            }
            catch (Exception ex)
            {
                return "获取最大的到货单号出错：" + ex.Message;
            }
            int ID = 0;// 1000000021;
            int iAutoID = 0;// 1000000034;
            strPath = "2";
            dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Sort = "SortID";
            string strDetailWhere = "";
            for (int i = 0; i < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; i++)
            {
                string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["ID"].ToString();
                if (strID == string.Empty)
                    continue;
                if (strDetailWhere == "")
                    strDetailWhere = strID;
                else
                    strDetailWhere = strDetailWhere + " , " + strID;
            }
            if (strDetailWhere == "")
            {
                return "送货单明细信息的采购明细ID为空！";
            }
            //
            DataSet dsStock = new DataSet();
            List<DataTableName> dtnList = new List<DataTableName>();
            DataTableName dtn = new DataTableName();
            dtn.strSelectSQL = "select PO_Pomain.cPOID ,\r\n" +
                               " CONVERT(VARCHAR(20), PO_Pomain.cmaketime, 23) 创建日期 ,\r\n" +
                               " PO_Podetails.fPoArrQuantity,\r\n" +
                               " PO_Podetails.iTax 税额 ,\r\n" +
                               " PO_Pomain.POID ,\r\n" +
                               " PO_Pomain.cBusType ,\r\n" +
                               " PO_Pomain.csccode ,\r\n" +
                               " PO_Pomain.cexch_name ,\r\n" +
                               " PO_Pomain.itaxrate ,\r\n" +
                               " PO_Pomain.nflat ,\r\n" +
                               " PO_Pomain.iflowid ,\r\n" +
                               " PurchaseType.cPTName ,\r\n" +
                               " PO_Podetails.ID DetailID ,\r\n" +
                               " hr_hi_person.cPsn_Name ,\r\n" +
                               " PO_Pomain.cVenCode 供应商编码 ,\r\n" +
                               " PO_Pomain.cdepcode,\r\n" +
                               " PO_Pomain.cptcode,\r\n" +
                               " PO_Pomain.cpersoncode,\r\n" +
                               " Department.cDepName 部门名称 ,\r\n" +
                               " vendor.cVenName 供应商名称 ,\r\n" +
                               " PO_Podetails.cInvCode 货号 ,\r\n" +
                               " inventory.cInvName 品名 ,\r\n" +
                               " inventory.cInvStd 规格 ,\r\n" +
                               " inventory.cInvCCode ,\r\n" +
                               " PO_Podetails.iQuantity 数量 ,\r\n" +
                               " PO_Podetails.iUnitPrice 不含税单价,\r\n" +
                               " PO_Podetails.iTaxPrice 含税单价,\r\n" +
                               " PO_Podetails.iPerTaxRate 税额,\r\n" +
                               " PO_Podetails.iNum 件数 ,\r\n" +
                               " PO_Podetails.iPerTaxRate,\r\n" +
                               " PO_Podetails.btaxcost,\r\n" +
                               " PO_Podetails.bgsp,\r\n" +
                               " ComputationUnit.cComUnitname 主单位 ,\r\n" +
                               " ComputationUnits.ichangrate,\r\n" +
                               " ComputationUnits.cComUnitname 辅计量单位 ,\r\n Inventory.cSAComUnitCode  CUNITID ," +
                               " Inventory.cDefWareHouse 仓库编码 ,\r\n" +
                               " Inventory.cInvDefine1,\r\n" +
                               " (SELECT cWhCode\r\n" +
                               "  from  " + strYongYouDBName + ".dbo.WareHouse\r\n" +
                                "  WHERE (cWhCode=Warehouse.cWhCode)  \r\n" +
                               " AND (case when ISNULL(dWhEndDate,'')='' then '9999-12-31' else dWhEndDate end) >  GETDATE()\r\n" +
                               " AND Warehouse.bProxyWh=0 \r\n" +
                               " and warehouse.bWhAsset<>1  \r\n" +
                               "  AND (bBondedWh = (select top 1 isnull(bbondedinv,0) \r\n" +
                               "  from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode) or \r\n" +
                               "  (select top 1 isnull(bbondedinv,0) \r\n" +
                                " from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode)='1'))  Warehouse_cWhCode ,\r\n" +
                               " (SELECT cWhName\r\n" +
                               "  from  " + strYongYouDBName + ".dbo.WareHouse\r\n" +
                                "  WHERE (cWhCode=Warehouse.cWhCode)  \r\n" +
                               " AND (case when ISNULL(dWhEndDate,'')='' then '9999-12-31' else dWhEndDate end) >  GETDATE()\r\n" +
                               " AND Warehouse.bProxyWh=0 \r\n" +
                               " and warehouse.bWhAsset<>1  \r\n" +
                               "  AND (bBondedWh = (select top 1 isnull(bbondedinv,0) \r\n" +
                               "  from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode) or \r\n" +
                               "  (select top 1 isnull(bbondedinv,0) \r\n" +
                                " from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode)='1')) Warehouse_cWhName,\r\n" +
                               " PO_Podetails.cFree2 公差\r\n" +
                               " FROM " + strYongYouDBName + ".dbo.PO_Pomain PO_Pomain\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.PO_Podetails PO_Podetails ON PO_Pomain.POID = PO_Podetails.POID\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.vendor vendor ON PO_Pomain.cVenCode = vendor.cVenCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.Department Department ON PO_Pomain.cDepCode = Department.cDepCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.PurchaseType PurchaseType ON PO_Pomain.cptcode = PurchaseType.cptcode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.Inventory Inventory ON PO_Podetails.cInvCode = Inventory.cInvCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.ComputationUnit ComputationUnit ON Inventory.cComUnitCode = ComputationUnit.cComUnitCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.ComputationUnit ComputationUnits ON Inventory.cSAComUnitCode = ComputationUnits.cComUnitCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.hr_hi_person hr_hi_person ON PO_Pomain.cPersonCode = hr_hi_person.cPsn_Num\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.Warehouse Warehouse ON Inventory.cDefWareHouse = Warehouse.cWhCode\r\n" +
                                " where PO_Podetails.ID in (" + strDetailWhere + ")";
            dtn.strTableName = "table_1";
            dtnList.Add(dtn);
            try
            {
                dsStock = CustomizableDesignBLL.GetData(dtnList, false);
            }
            catch (Exception ex)
            {
                return "取采购订单的数据出错：" + ex.Message;
            }
            for (int i = 0; i < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; i++)
            {
                if (dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["ID"] == DBNull.Value)
                {
                    return "T_SHOrderProduct第" + (i + 1).ToString() + "行相对应的采购订单ID为空！";
                }
                string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["ID"].ToString();
                if (dsStock.Tables[0].Select("DetailID='" + strID + "'").Length == 0)
                {
                    return "第" + (i + 1).ToString() + "行相对应的采购订单不存在！";
                }
            }
            //判断数量有没有超出
            foreach (DataRowView drv in dsStock.Tables[0].DefaultView)
            {
                int iDetailID = drv["DetailID"] == DBNull.Value ? 0 : Convert.ToInt32(drv["DetailID"].ToString());
                decimal deciQuantity = drv["数量"] == DBNull.Value ? 0 : Convert.ToDecimal(drv["数量"].ToString());
                decimal decfPoArrQuantity = drv["fPoArrQuantity"] == DBNull.Value ? 0 : Convert.ToDecimal(drv["fPoArrQuantity"].ToString());
                DataRow[] drSelectRows = dsSHOrder.Tables["T_SHOrderProduct"].Select("ID=" + iDetailID.ToString());
                decimal decSHQuantity = 0;
                for (int i = 0; i < drSelectRows.Length; i++)
                {
                    decimal decQuantityTemp = drSelectRows[i]["Quantity"] == DBNull.Value ? 0 : Convert.ToDecimal(drSelectRows[i]["Quantity"].ToString());
                    decSHQuantity = decSHQuantity + decQuantityTemp;
                }
                decimal decChaoChuQty = deciQuantity - decfPoArrQuantity - decSHQuantity;
                decChaoChuQty = -decChaoChuQty;
                if (deciQuantity > decfPoArrQuantity + decSHQuantity)
                {
                    //return "存货代码" + drv["货号"].ToString() + "，订单数量" + deciQuantity.ToString("###,###,###,##0.00####") + "，已送货数量" + decfPoArrQuantity.ToString("###,###,###,##0.00####") + "，本次送货数量" + decSHQuantity.ToString("###,###,###,##0.00####") + "超出" + decChaoChuQty.ToString("###,###,###,##0.00####");
                }
            }
            strPath = "2.2";
            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //采购所有接口均支持内部独立事务和外部事务，默认内部事务
            //如果是外部事务，则需要传递ADO.Connection对象，并将IsIndependenceTransaction属性设置为false
            //envContext.BizDbConnection = new ADO.Connection();
            //envContext.IsIndependenceTransaction = false;

            //设置上下文参数
            envContext.SetApiContext("VoucherType", 2); //上下文数据类型：int，含义：单据类型， 采购到货单 2 
            envContext.SetApiContext("bPositive", true); //上下文数据类型：bool，含义：红蓝标识：True,蓝字；False,红字
            envContext.SetApiContext("sBillType", "0"); //上下文数据类型：string，含义：到货单类型， 到货单 0 退货单 1
            envContext.SetApiContext("sBusType", dsStock.Tables[0].DefaultView[0]["cBusType"].ToString()); //cqz "普通采购" //上下文数据类型：string，含义：业务类型：普通采购,直运采购,受托代销

            //第三步：设置API地址标识(Url)
            //当前API：新增或修改的地址标识为：U8API/ArrivedGoods/VoucherSave
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ArrivedGoods/VoucherSave");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值
            //给BO表头参数DomHead赋值，此BO参数的业务类型为到货单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            strPath = "3";
            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = ID; //主关键字段，int类型
            DomHead[0]["cbustype"] = dsStock.Tables[0].DefaultView[0]["cBusType"].ToString(); //业务类型，int类型
            DomHead[0]["ccode"] = strNewccode; //单据号，string类型
            DomHead[0]["ddate"] = sDate; //日期，DateTime类型
            DomHead[0]["cvenabbname"] = dsStock.Tables[0].DefaultView[0]["供应商名称"].ToString(); //供应商，string类型 
            DomHead[0]["cdepname"] = dsStock.Tables[0].DefaultView[0]["部门名称"].ToString();  //部门，string类型 
            DomHead[0]["cexch_name"] = dsStock.Tables[0].DefaultView[0]["cexch_name"].ToString();  //币种，string类型
            decimal iexchrate = 0;
            if (dsStock.Tables[0].DefaultView[0]["nflat"] != DBNull.Value)
            {
                iexchrate = Convert.ToDecimal(dsStock.Tables[0].DefaultView[0]["nflat"].ToString()); //汇率，double类型
            }
            DomHead[0]["iexchrate"] = iexchrate; //汇率，double类型
            //DomHead[0]["cflowname"] = ""; //流程模式描述，string类型
            //DomHead[0]["cchanger"] = ""; //变更人，string类型
            if (dsStock.Tables[0].DefaultView[0]["iflowid"] != DBNull.Value)
                DomHead[0]["iflowid"] = dsStock.Tables[0].DefaultView[0]["iflowid"].ToString(); //cqz 流程ID，string类型
            DomHead[0]["cpocode"] = dsStock.Tables[0].DefaultView[0]["cPOID"].ToString(); //单号，string类型
            //DomHead[0]["csysbarcode"] = ds.Tables["PU_ArrivalVouch"].DefaultView[0]["csysbarcode"].ToString();  //单据条码，string类型 cqz
            //DomHead[0]["csysbarcodepo"] = ""; //来源条形码，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            DateTime dtNow = DateTime.Now;
            DomHead[0]["cmaketime"] = dtNow.ToString("yyyy-MM-dd"); //制单时间，DateTime类型
            DomHead[0]["cmodifytime"] = dtNow.ToString("yyyy-MM-dd"); //修改时间，DateTime类型
            DomHead[0]["cmodifydate"] = dtNow.ToString("yyyy-MM-dd"); //修改日期，DateTime类型
            DomHead[0]["creviser"] = sUserID; //修改人，string类型
            //DomHead[0]["caudittime"] = ""; //审核时间，DateTime类型
            //DomHead[0]["cauditdate"] = ""; //审核日期，DateTime类型
            DomHead[0]["cptname"] = dsStock.Tables[0].DefaultView[0]["cPTName"].ToString(); //采购类型，string类型 
            //DomHead[0]["ccloser"] = ""; //关闭人，string类型
            DomHead[0]["iverifystateex"] = "0"; //审核状态，string类型
            //DomHead[0]["ireturncount"] = ""; //打回次数，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //是否启用工作流，string类型
            DomHead[0]["cpersonname"] = dsStock.Tables[0].DefaultView[0]["cPsn_Name"].ToString(); //业 务 员，string类型
            //DomHead[0]["cscname"] = dsStock.Tables[0].DefaultView[0]["pu_ArrHead_cscname"].ToString(); //cqz 运输方式，string类型
            decimal itaxrate = 0;
            if (dsStock.Tables[0].DefaultView[0]["itaxrate"] != DBNull.Value)
            {
                itaxrate = Convert.ToDecimal(dsStock.Tables[0].DefaultView[0]["itaxrate"].ToString()); //汇率，double类型
            }
            DomHead[0]["itaxrate"] = itaxrate.ToString(); //税率，double类型
            //DomHead[0]["cmemo"] = dsStock.Tables[0].DefaultView[0]["cmemo"].ToString(); //备注，string类型
            // DomHead[0]["cmaker"] = sUserID; //制单人，string类型
            DomHead[0]["cmaker"] = dsPDA.Tables[0].DefaultView[0]["CreaterName"].ToString(); //制单人，string类型
            DomHead[0]["ivtid"] = "8169"; //单据模版号，int类型
            //DomHead[0]["cverifier"] = ""; //审核人，string类型
            DomHead[0]["bnegative"] = "0"; //负发票标志，string类型
            DomHead[0]["cvencode"] = dsStock.Tables[0].DefaultView[0]["供应商编码"].ToString(); //供货单位编号，string类型
            DomHead[0]["cdepcode"] = dsStock.Tables[0].DefaultView[0]["cdepcode"].ToString(); //部门编号，string类型
            DomHead[0]["cptcode"] = dsStock.Tables[0].DefaultView[0]["cptcode"].ToString(); //采购类型编码，string类型
            //DomHead[0]["cpaycode"] = ""; //付款条件编码，string类型
            DomHead[0]["cpersoncode"] = dsStock.Tables[0].DefaultView[0]["cpersoncode"].ToString(); //职员编号，string类型
            DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["cpayname"] = ""; //付款条件，string类型
            DomHead[0]["csccode"] = dsStock.Tables[0].DefaultView[0]["csccode"].ToString();//运输方式编码，string类型
            //DomHead[0]["cdefine1"] = dsStock.Tables[0].DefaultView[0]["cdefine1"].ToString();//cqz 表头自定义项1，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            DomHead[0]["cdefine5"] = dsPDA.Tables["T_CGDH"].DefaultView[0]["ID"].ToString(); //表头自定义项5，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            DomHead[0]["cdefine10"] = strSHOrderNum; //表头自定义项10，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["cvendefine1"] = ""; //供应商自定义项1，string类型
            //DomHead[0]["cvendefine2"] = ""; //供应商自定义项2，string类型
            //DomHead[0]["cvendefine3"] = ""; //供应商自定义项3，string类型
            //DomHead[0]["cvendefine4"] = ""; //供应商自定义项4，string类型
            //DomHead[0]["cvendefine5"] = ""; //供应商自定义项5，string类型
            //DomHead[0]["cvendefine6"] = ""; //供应商自定义项6，string类型
            //DomHead[0]["cvendefine7"] = ""; //供应商自定义项7，string类型
            //DomHead[0]["cvendefine8"] = ""; //供应商自定义项8，string类型
            //DomHead[0]["cvendefine9"] = ""; //供应商自定义项9，string类型
            //DomHead[0]["cvendefine10"] = ""; //供应商自定义项10，string类型
            //DomHead[0]["cvendefine11"] = ""; //供应商自定义项11，string类型
            //DomHead[0]["cvendefine12"] = ""; //供应商自定义项12，string类型
            //DomHead[0]["cvendefine13"] = ""; //供应商自定义项13，string类型
            //DomHead[0]["cvendefine14"] = ""; //供应商自定义项14，string类型
            //DomHead[0]["cvendefine15"] = ""; //供应商自定义项15，string类型
            //DomHead[0]["cvendefine16"] = ""; //供应商自定义项16，string类型
            DomHead[0]["idiscounttaxtype"] = "0"; //扣税类别，int类型
            DomHead[0]["ibilltype"] = "0"; //单据类型，int类型
            //DomHead[0]["cvenpuomprotocol"] = ""; //收付款协议编码，string类型
            //DomHead[0]["cvenpuomprotocolname"] = ""; //收付款协议名称，string类型

            strPath = "4";
            //给BO表体参数domBody赋值，此BO参数的业务类型为到货单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = dsStock.Tables[0].DefaultView.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            for (int iRow = 0; iRow < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; iRow++)
            {
                string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["ID"].ToString();
                DataRow[] drSelectRowsStock = dsStock.Tables[0].Select("DetailID='" + strID + "'");
                if (drSelectRowsStock.Length == 0)
                    continue;
                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = iAutoID + 1; //主关键字段，int类型
                domBody[iRow]["cinvcode"] = drSelectRowsStock[0]["货号"].ToString(); //存货编码，string类型
                //
                decimal iquantity = 0;
                string strSerialID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["SerialID"].ToString();
                //获取PDA表里面的修改数量
                DataRow[] drSlectPDA = dsPDA.Tables["T_CGDHProduct"].Select("SHSerialID='" + strSerialID + "'");
                //
                if (drSlectPDA.Length > 0)
                {
                    if (drSlectPDA[0]["Quantity"] != DBNull.Value)
                        iquantity = Convert.ToDecimal(drSlectPDA[0]["Quantity"].ToString());
                }
                domBody[iRow]["iquantity"] = iquantity.ToString(); //主计量数量，double类型
                //
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                domBody[iRow]["ivouchrowno"] = (iRow + 1).ToString(); //行号，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，string类型
                //domBody[iRow]["cbmemo"] = drSelectRowsStock[0]["cbmemo"].ToString(); //cqz 备注，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型 cqz
                //domBody[iRow]["carrivalcode"] = ""; //到货单号，string类型
                //domBody[iRow]["irejectautoid"] = ""; //irejectautoid，string类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，string类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，string类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，string类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型
                //if (drSelectRowsStock[0]["cInvCCode"].ToString() == "030102" || drSelectRowsStock[0]["cInvCCode"].ToString() == "030202")
                //{
                //    domBody[iRow]["cbatchproperty8"] = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["LuNo"].ToString(); //炉号的值  批次属性8，string类型
                //}
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，string类型
                //domBody[iRow]["isourcemocode"] = ""; //源订单号，string类型
                //domBody[iRow]["isourcemodetailsid"] = ""; //源订单子表ID，string类型
                //domBody[iRow]["freworkquantity"] = ""; //返工数量，string类型
                //domBody[iRow]["freworknum"] = ""; //返工件数，string类型
                //domBody[iRow]["iproducttype"] = "0"; //cqz产出品类型，string类型
                //domBody[iRow]["cmaininvcode"] = ""; //主产品存货编码，string类型
                //domBody[iRow]["imainmodetailsid"] = ""; //主产品订单子表ID，string类型
                //domBody[iRow]["planlotnumber"] = ""; //计划批号，string类型
                domBody[iRow]["bgift"] = "0"; //赠品，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型

                /***************************** 以下是非必输字段 ****************************/
                domBody[iRow]["cinvstd"] = drSelectRowsStock[0]["规格"].ToString(); //规格型号，string类型
                //
                decimal iinvexchrate = 0;
                if (drSelectRowsStock[0]["ichangrate"] != DBNull.Value)
                {
                    iinvexchrate = Convert.ToDecimal(drSelectRowsStock[0]["ichangrate"].ToString());
                }
                domBody[iRow]["iinvexchrate"] = iinvexchrate.ToString(); //换算率，double类型
                //
                decimal inum = 0;
                if (iinvexchrate != 0)
                {
                    inum = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity / iinvexchrate, 2);
                }
                domBody[iRow]["inum"] = inum.ToString(); //件数，double类型
                //
                itaxrate = 0;
                if (drSelectRowsStock[0]["iPerTaxRate"] != DBNull.Value)
                {
                    itaxrate = Convert.ToDecimal(drSelectRowsStock[0]["iPerTaxRate"].ToString());
                }
                domBody[iRow]["itaxrate"] = itaxrate.ToString(); //税率，double类型
                //
                decimal ioricost = 0;
                if (drSelectRowsStock[0]["不含税单价"] != DBNull.Value)
                {
                    ioricost = Convert.ToDecimal(drSelectRowsStock[0]["不含税单价"].ToString());
                }
                domBody[iRow]["ioricost"] = ioricost.ToString(); //原币单价，double类型
                //
                decimal iorimoney = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity * ioricost, 2);
                domBody[iRow]["iorimoney"] = iorimoney.ToString(); //原币金额，double类型
                //
                decimal ioritaxprice = Trade.DBUtility.Common.decimalEx.RoundEx(iorimoney * itaxrate / 100, 2);
                domBody[iRow]["ioritaxprice"] = ioritaxprice.ToString(); //原币税额，double类型
                //
                decimal icost = 0;
                if (drSelectRowsStock[0]["不含税单价"] != DBNull.Value)
                {
                    icost = Convert.ToDecimal(drSelectRowsStock[0]["不含税单价"].ToString());
                }
                domBody[iRow]["icost"] = icost.ToString(); //本币单价，double类型
                //
                decimal imoney = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity * icost, 2);
                domBody[iRow]["imoney"] = imoney.ToString(); //本币金额，double类型
                //
                decimal itaxprice = Trade.DBUtility.Common.decimalEx.RoundEx(imoney * itaxrate / 100, 2);
                domBody[iRow]["itaxprice"] = itaxprice.ToString(); //本币税额，double类型
                //
                decimal isum = imoney + itaxprice;
                domBody[iRow]["isum"] = isum.ToString(); //本币价税合计，double类型
                //
                //domBody[iRow]["cinvdefine1"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine1"].ToString(); //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine4"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine4"].ToString();  //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine5"].ToString();  //存货自定义项5，string类型
                //domBody[iRow]["cfree1"] = drSelectRowsStock[0]["cfree1"].ToString(); //自由项1，string类型
                //domBody[iRow]["cinvdefine6"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine6"].ToString(); //存货自定义项6，string类型
                //domBody[iRow]["cfree2"] = drSelectRowsStock[0]["公差"].ToString();//自由项2，string类型
                //domBody[iRow]["cinvdefine7"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine7"].ToString(); //存货自定义项7，string类型
                decimal iorisum = iorimoney + ioritaxprice;
                domBody[iRow]["iorisum"] = iorisum.ToString(); //原币价税合计，double类型
                //domBody[iRow]["cinvdefine8"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine8"].ToString(); //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine9"].ToString();//存货自定义项9，string类型
                //domBody[iRow]["cdefine22"] = drSelectRowsStock[0]["cdefine22"].ToString();//表体自定义项1，string类型
                //domBody[iRow]["cinvdefine10"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine10"].ToString(); //存货自定义项10，string类型
                //domBody[iRow]["cdefine23"] = drSelectRowsStock[0]["cdefine23"].ToString();//表体自定义项2，string类型
                //domBody[iRow]["cinvdefine11"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine11"].ToString(); //存货自定义项11，string类型
                //domBody[iRow]["cdefine24"] = drSelectRowsStock[0]["cdefine24"].ToString(); //表体自定义项3，string类型
                //domBody[iRow]["cinvdefine12"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine12"].ToString(); //存货自定义项12，string类型
                //domBody[iRow]["cdefine25"] = drSelectRowsStock[0]["cdefine25"].ToString(); //表体自定义项4，string类型
                //domBody[iRow]["cinvdefine13"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine13"].ToString(); //存货自定义项13，string类型
                //
                //decimal cdefine26 = 0;
                //if (drSelectRowsStock[0]["cdefine26"] != DBNull.Value)
                //{
                //    cdefine26 = Convert.ToDecimal(drSelectRowsStock[0]["cdefine26"].ToString());
                //}
                //domBody[iRow]["cdefine26"] = cdefine26.ToString(); //表体自定义项5，double类型
                ////
                //domBody[iRow]["cinvdefine14"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine14"].ToString(); //存货自定义项14，string类型
                ////
                //decimal cdefine27 = 0;
                //if (drSelectRowsStock[0]["cdefine27"] != DBNull.Value)
                //{
                //    cdefine27 = Convert.ToDecimal(drSelectRowsStock[0]["cdefine27"].ToString());
                //}
                //domBody[iRow]["cdefine27"] = cdefine27.ToString(); //表体自定义项6，double类型
                ////
                //domBody[iRow]["cinvdefine15"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine15"].ToString(); //存货自定义项15，string类型

                ////
                //domBody[iRow]["cinvdefine16"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine16"].ToString(); //存货自定义项16，string类型
                //domBody[iRow]["citemcode"] = drSelectRowsStock[0]["citemcode"].ToString();//项目编码，string类型
                //domBody[iRow]["cinvdefine2"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine3"].ToString(); //存货自定义项2，string类型
                //domBody[iRow]["citem_class"] = drSelectRowsStock[0]["citem_class"].ToString();//项目大类编码，string类型
                //domBody[iRow]["cinvdefine3"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine3"].ToString(); //存货自定义项3，string类型
                //
                domBody[iRow]["iposid"] = strID; //订单子表ID，int类型
                //
                //domBody[iRow]["citemname"] = drSelectRowsStock[0]["citemname"].ToString();//项目名称，string类型
                //domBody[iRow]["citem_name"] = drSelectRowsStock[0]["pu_ArrBody_citem_name"].ToString(); //项目大类名称，string类型
                //domBody[iRow]["cfree3"] = drSelectRowsStock[0]["cfree3"].ToString();  //自由项3，string类型
                //domBody[iRow]["cfree4"] = drSelectRowsStock[0]["cfree4"].ToString();  //自由项4，string类型
                //domBody[iRow]["cfree5"] = drSelectRowsStock[0]["cfree5"].ToString();  //自由项5，string类型
                //domBody[iRow]["cfree6"] = drSelectRowsStock[0]["cfree6"].ToString();  //自由项6，string类型
                //domBody[iRow]["cfree7"] = drSelectRowsStock[0]["cfree7"].ToString();  //自由项7，string类型
                //domBody[iRow]["cfree8"] = drSelectRowsStock[0]["cfree8"].ToString();  //自由项8，string类型
                //domBody[iRow]["cfree9"] = drSelectRowsStock[0]["cfree9"].ToString();  //自由项9，string类型
                //domBody[iRow]["cfree10"] = drSelectRowsStock[0]["cfree10"].ToString();  //自由项10，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                domBody[iRow]["cunitid"] = drSelectRowsStock[0]["CUNITID"].ToString(); //单位编码，string类型
                //domBody[iRow]["cinva_unit"] = drSelectRowsStock[0]["pu_ArrBody_cinva_unit"].ToString();//采购单位，string类型
                //domBody[iRow]["cinvm_unit"] = drSelectRowsStock[0]["pu_ArrBody_cinvm_unit"].ToString();//主计量，string类型
                //domBody[iRow]["igrouptype"] = drSelectRowsStock[0]["pu_ArrBody_igrouptype"].ToString(); //分组类型，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                domBody[iRow]["cdefine34"] = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["SerialID"].ToString(); //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //
                decimal ioritaxcost = 0;
                if (drSelectRowsStock[0]["含税单价"] != DBNull.Value)
                {
                    ioritaxcost = Convert.ToDecimal(drSelectRowsStock[0]["含税单价"].ToString());
                }
                domBody[iRow]["ioritaxcost"] = ioritaxcost.ToString(); //含税单价，double类型
                //
                //domBody[iRow]["icorid"] = ""; //到货单子表id，int类型
                // domBody[iRow]["cbatch"] = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["BatchNO"].ToString(); //批号，string类型
                //domBody[iRow]["dpdate"] = ""; //生产日期，DateTime类型
                //domBody[iRow]["dvdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //
                int bgsp = 0;
                if (drSelectRowsStock[0]["bgsp"] != DBNull.Value)
                {
                    bgsp = Convert.ToInt32(drSelectRowsStock[0]["bgsp"].ToString());
                }
                domBody[iRow]["bgsp"] = bgsp.ToString(); //是否检验，int类型
                domBody[iRow]["id"] = ID; //主表id，int类型
                domBody[iRow]["cwhcode"] = strcwhcode;//cqz 仓库编码，string类型
                //domBody[iRow]["cwhname"] = drSelectRowsStock[0]["Warehouse_cWhName"].ToString();//cqz 仓库名称，string类型
                domBody[iRow]["cinvname"] = drSelectRowsStock[0]["品名"].ToString();//存货名称，string类型
                int btaxcost = 0;
                if (drSelectRowsStock[0]["btaxcost"] != DBNull.Value)
                {
                    if ((bool)drSelectRowsStock[0]["btaxcost"])
                    {
                        btaxcost = 1;
                    }
                    else
                    {
                        btaxcost = 0;
                    }
                }
                domBody[iRow]["btaxcost"] = btaxcost.ToString(); //单价标准，string类型
                //domBody[iRow]["binspect"] = ""; //是否已报检，int类型
                //domBody[iRow]["fvalidquantity"] = ""; //合格数量，double类型
                //domBody[iRow]["finvalidquantity"] = ""; //不合格数量，double类型
                //domBody[iRow]["frefusequantity"] = ""; //拒收数量，double类型
                //domBody[iRow]["cinvaddcode"] = ""; //存货代码，string类型
                //domBody[iRow]["frefusenum"] = ""; //拒收件数，double类型
                //domBody[iRow]["cveninvcode"] = ""; //供应商存货编码，string类型
                //domBody[iRow]["cveninvname"] = ""; //供应商存货名称，string类型
                //domBody[iRow]["bexigency"] = "0"; //是否急料，int类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["ippartid"] = ""; //母件Id，int类型
                //domBody[iRow]["ipquantity"] = ""; //母件数量，int类型
                //domBody[iRow]["iptoseq"] = ""; //选配序号，int类型
                domBody[iRow]["cordercode"] = drSelectRowsStock[0]["cPOID"].ToString();//订单号，string类型
                //domBody[iRow]["contractrowno"] = drSelectRowsStock[0]["contractrowno"].ToString();//合同标的编码，string类型
                //domBody[iRow]["contractrowguid"] = drSelectRowsStock[0]["contractrowguid"].ToString();//合同标的GUID，string类型
                //domBody[iRow]["contractcode"] = drSelectRowsStock[0]["contractcode"].ToString();//合同号，string类型
                domBody[iRow]["sotype"] = "0"; //需求跟踪方式，int类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["irowno"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["sodid"] = ""; //需求跟踪子表ID，string类型
                //domBody[iRow]["frealquantity"] = ""; //实收数量，double类型
                //domBody[iRow]["frealnum"] = ""; //实收件数，double类型
                //domBody[iRow]["fsumrefusequantity"] = ""; //已拒收数量，double类型
                //domBody[iRow]["fsumrefusenum"] = ""; //已拒收件数，double类型
                //domBody[iRow]["fvalidnum"] = ""; //合格件数，double类型
                domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，DateTime类型
                //domBody[iRow]["cbcloser"] = ""; //行关闭人，string类型
                //domBody[iRow]["dValidateDate"] = ""; //有效期，string类型
                //domBody[iRow]["iinvmpcost"] = ""; //最高进价，double类型
                //domBody[iRow]["cupsocode"] = ""; //不良品处理单号，string类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型
                //domBody[iRow]["iorderdid"] = ""; //销售订单子表id ，int类型
                domBody[iRow]["iordertype"] = "0"; //销售订单类型 ，int类型
                //domBody[iRow]["csoordercode"] = ""; //销售订单号 ，string类型
                //domBody[iRow]["iorderseq"] = ""; //销售订单行号 ，int类型
            }
            //给普通参数VoucherState赋值。此参数的数据类型为int，此参数按值传递，表示单据状态：2新增，1修改，0非编辑
            broker.AssignNormalValue("VoucherState", 2);

            //该参数curID为OUT型参数，由于其数据类型为string，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("curID")获取其值

            //该参数CurDom为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 CurDom = new MSXML2.DOMDocument();
            broker.AssignNormalValue("CurDom", CurDom);

            //给普通参数UserMode赋值。此参数的数据类型为int，此参数按值传递，表示模式，0：CS;1:BS
            broker.AssignNormalValue("UserMode", 0);

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strRetMsg = "";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRetMsg = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRetMsg = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRetMsg = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRetMsg;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.String，此参数按值传递，表示错误描述：空，正确；非空，错误
            System.String result = broker.GetReturnValue() as System.String;
            if (result != null && result != string.Empty)
            {
                broker.Release();
                return "失败！" + result;
            }
            //获取out/inout参数值

            //获取普通OUT参数curID。此返回值数据类型为string，在使用该参数之前，请判断是否为空
            string curIDRet = broker.GetResult("curID") as string;

            //获取普通OUT参数CurDom。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 CurDomRet = Convert.ToObject(broker.GetResult("CurDom"));

            //结束本次调用，释放API资源
            broker.Release();
            #region 由于代管仓库不能赋值，所以通过SQL回刷
            DataSet dsPO = new DataSet();
            DataTableName dtnPO = new DataTableName();
            dtnPO.strSelectSQL = "select * from " + strYongYouDBName + ".dbo.PU_ArrivalVouchs where id in (select id from " + strYongYouDBName + ".dbo.PU_ArrivalVouch where isnull(cDefine10,'')='" + strSHOrderNum + "')";
            dtnPO.strSaveSQL = "select * from " + strYongYouDBName + ".dbo.PU_ArrivalVouchs";
            dtnPO.strTableName = "PU_ArrivalVouchs";
            //
            try
            {
                dsPO = CustomizableDesignBLL.GetData(dtnPO, true);
            }
            catch (Exception ex)
            {
                return "刷新采购到货单的仓库出错:" + ex.Message;
            }
            //for (int iRow = 0; iRow < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; iRow++)
            //{
            //    DataRow[] drSelectRows = dsPO.Tables[0].Select("cdefine34=" + dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["SerialID"].ToString());
            //    if (drSelectRows.Length == 0)
            //    {
            //        return "刷新采购到货单的仓库出错:第" + (iRow + 1).ToString() + "行没有找到";
            //    }
            //    string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["ID"].ToString();
            //    DataRow[] drSelectRowsStock = dsStock.Tables[0].Select("DetailID='" + strID + "'");
            //    if (drSelectRowsStock.Length == 0)
            //    {
            //        return "刷新采购到货单的仓库出错:第" + (iRow + 1).ToString() + "行没有找到到货单";
            //    }
            //    //仓库编码
            //    if (drSelectRowsStock[0]["cBusType"].ToString() == "代管采购")
            //    {
            //        drSelectRows[0]["cWhCode"] = drSelectRowsStock[0]["仓库编码"].ToString();
            //    }
            //    else
            //    {
            //        if (drSelectRowsStock[0]["cInvDefine1"].ToString().Trim() == string.Empty)
            //        {
            //            return "第" + (iRow + 1).ToString() + "行没有设置对应的仓库";
            //        }
            //        drSelectRows[0]["cWhCode"] = drSelectRowsStock[0]["cInvDefine1"].ToString();
            //    }
            //    //
            //    drSelectRows[0].EndEdit();
            //}


            //foreach (DataRowView drv in dsPO.Tables["PU_ArrivalVouchs"].DefaultView)
            //{
            //    drv["cWhCode"] = strcwhcode;
            //    drv.EndEdit();
            //}
            //DataTableName.SaveAfterSQL sql1 = new DataTableName.SaveAfterSQL();
            //sql1.strSQL = "update " + strYongYouDBName + ".dbo.PU_ArrivalVouch\r\n" +
            //                "set cmaker=(select top 1 cUser_Name from UFSystem.dbo.UA_User where cuser_id='" + sUserID + "')\r\n" +
            //                    "where isnull(cDefine10,'')='" + strSHOrderNum + "'";
            //dtnPO.SaveAfterSQLList.Add(sql1);
            //保存
            try
            {
                if (dsPO.GetChanges() != null)
                    CustomizableDesignBLL.SaveData(dsPO.GetChanges(), dtnPO);
            }
            catch (Exception ex)
            {
                return "保存采购到货单的仓库出错";
            }
            #endregion
            return "";
        }
        #endregion
        #region 到货单审核API
        /// <summary>
        /// 到货单审核API
        /// </summary>
        /// <param name="strYongYouDBName">UFDATA_999_2014</param>
        /// <param name="sAccID">999</param>
        /// <param name="sYear">2017</param>
        /// <param name="sUserID">demo</param>
        /// <param name="sPassword">demo</param>
        /// <param name="sDate">2017-08-19</param>
        /// <param name="sServer">127.0.0.1</param>
        /// <param name="strSHOrderNum">送货单号</param>
        /// <returns></returns>
        public string DHDAudit(string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strSHOrderNum, string strPDASerialNum, DataSet dsPDA)
        {
            //判断是否已经搞过了
            string strISExists = "SELECT PU_ArrivalVouch.* ,\r\n" +
                               " vendor.cVenName 供应商名称 ,\r\n" +
                               " Department.cDepName 部门名称\r\n" +
                                "FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch \r\n" +
                                " LEFT JOIN " + strYongYouDBName + ".dbo.vendor vendor ON PU_ArrivalVouch.cVenCode = vendor.cVenCode\r\n" +
                                 " LEFT JOIN " + strYongYouDBName + ".dbo.Department Department ON PU_ArrivalVouch.cDepCode = Department.cDepCode\r\n" +
                                "where isnull(PU_ArrivalVouch.cDefine5,0)='" + dsPDA.Tables["T_CGDH"].DefaultView[0]["ID"].ToString() + "'";
            DataSet dsISExists = new DataSet();
            try
            {
                dsISExists = CustomizableDesignBLL.GetData(strISExists);
            }
            catch (Exception ex)
            {
                return "判断送货单号已经做过到货单，出错：" + ex.Message;
            }
            if (dsISExists == null || dsISExists.Tables[0].DefaultView.Count == 0)
            {
                return "送货单号还没有做过到货单";
            }
            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //采购所有接口均支持内部独立事务和外部事务，默认内部事务
            //如果是外部事务，则需要传递ADO.Connection对象，并将IsIndependenceTransaction属性设置为false
            //envContext.BizDbConnection = new ADO.Connection();
            //envContext.IsIndependenceTransaction = false;

            //设置上下文参数
            envContext.SetApiContext("VoucherType", 2); //上下文数据类型：int，含义：单据类型，采购到货单 2 
            envContext.SetApiContext("bPositive", true); //上下文数据类型：bool，含义：红蓝标识：True,蓝字；False,红字
            envContext.SetApiContext("sBillType", "0"); //上下文数据类型：string，含义：到货单类型， 到货单 0 退货单 1
            envContext.SetApiContext("sBusType", dsISExists.Tables[0].DefaultView[0]["cBusType"].ToString()); //上下文数据类型：string，含义：业务类型：普通采购,直运采购,受托代销

            //第三步：设置API地址标识(Url)
            //当前API：审核采购到货单的地址标识为：U8API/ArrivedGoods/ConfirmArr
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ArrivedGoods/ConfirmArr");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);


            //第五步：API参数赋值
            //给BO表头参数DomHead赋值，此BO参数的业务类型为到货单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = dsISExists.Tables[0].DefaultView[0]["ID"].ToString(); //主关键字段，int类型
            DomHead[0]["cbustype"] = dsISExists.Tables[0].DefaultView[0]["cbustype"].ToString(); //业务类型，int类型
            DomHead[0]["ccode"] = dsISExists.Tables[0].DefaultView[0]["ccode"].ToString(); //单据号，string类型
            DomHead[0]["ddate"] = ((DateTime)dsISExists.Tables[0].DefaultView[0]["ddate"]).ToString("yyyy-MM-dd"); //日期，DateTime类型
            DomHead[0]["cvenabbname"] = dsISExists.Tables[0].DefaultView[0]["供应商名称"].ToString();  //供应商，string类型
            DomHead[0]["cdepname"] = dsISExists.Tables[0].DefaultView[0]["部门名称"].ToString(); //部门，string类型
            DomHead[0]["cexch_name"] = dsISExists.Tables[0].DefaultView[0]["cexch_name"].ToString(); //币种，string类型
            DomHead[0]["iexchrate"] = dsISExists.Tables[0].DefaultView[0]["iexchrate"].ToString(); //汇率，double类型
            DomHead[0]["cflowname"] = ""; //流程模式描述，string类型
            //DomHead[0]["cchanger"] = sUserID; //变更人，string类型

            DomHead[0]["cchanger"] = dsPDA.Tables[0].DefaultView[0]["CreaterName"].ToString(); //制单人，string类型

            if (dsISExists.Tables[0].DefaultView[0]["iflowid"] == DBNull.Value)
            {
                DomHead[0]["iflowid"] = ""; //流程ID，string类型
            }
            else
            {
                DomHead[0]["iflowid"] = dsISExists.Tables[0].DefaultView[0]["iflowid"].ToString(); //流程ID，string类型
            }
            DomHead[0]["cpocode"] = dsISExists.Tables[0].DefaultView[0]["cpocode"].ToString(); //订单号，string类型
            DomHead[0]["csysbarcode"] = dsISExists.Tables[0].DefaultView[0]["csysbarcode"].ToString(); //单据条码，string类型
            //DomHead[0]["csysbarcodepo"] = ""; //来源条形码，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["cmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["cmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["cmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["creviser"] = sUserID; //修改人，string类型
            //DomHead[0]["caudittime"] = ""; //审核时间，DateTime类型
            //DomHead[0]["cauditdate"] = ""; //审核日期，DateTime类型
            //DomHead[0]["cptname"] = ""; //采购类型，string类型
            //DomHead[0]["ccloser"] = ""; //关闭人，string类型
            //DomHead[0]["iverifystateex"] = ""; //审核状态，string类型
            //DomHead[0]["ireturncount"] = ""; //打回次数，string类型
            //DomHead[0]["iswfcontrolled"] = ""; //是否启用工作流，string类型
            //DomHead[0]["cpersonname"] = ""; //业 务 员，string类型
            //DomHead[0]["cscname"] = ""; //运输方式，string类型
            //DomHead[0]["itaxrate"] = ""; //税率，double类型
            //DomHead[0]["cmemo"] = ""; //备注，string类型
            //DomHead[0]["cmaker"] = ""; //制单人，string类型
            //DomHead[0]["ivtid"] = ""; //单据模版号，int类型
            //DomHead[0]["cverifier"] = ""; //审核人，string类型
            //DomHead[0]["bnegative"] = ""; //负发票标志，string类型
            //DomHead[0]["cvencode"] = ""; //供货单位编号，string类型
            //DomHead[0]["cdepcode"] = ""; //部门编号，string类型
            //DomHead[0]["cptcode"] = ""; //采购类型编码，string类型
            //DomHead[0]["cpaycode"] = ""; //付款条件编码，string类型
            //DomHead[0]["cpersoncode"] = ""; //职员编号，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["cpayname"] = ""; //付款条件，string类型
            //DomHead[0]["csccode"] = ""; //运输方式编码，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            //DomHead[0]["cdefine10"] = ""; //表头自定义项10，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["cvendefine1"] = ""; //供应商自定义项1，string类型
            //DomHead[0]["cvendefine2"] = ""; //供应商自定义项2，string类型
            //DomHead[0]["cvendefine3"] = ""; //供应商自定义项3，string类型
            //DomHead[0]["cvendefine4"] = ""; //供应商自定义项4，string类型
            //DomHead[0]["cvendefine5"] = ""; //供应商自定义项5，string类型
            //DomHead[0]["cvendefine6"] = ""; //供应商自定义项6，string类型
            //DomHead[0]["cvendefine7"] = ""; //供应商自定义项7，string类型
            //DomHead[0]["cvendefine8"] = ""; //供应商自定义项8，string类型
            //DomHead[0]["cvendefine9"] = ""; //供应商自定义项9，string类型
            //DomHead[0]["cvendefine10"] = ""; //供应商自定义项10，string类型
            //DomHead[0]["cvendefine11"] = ""; //供应商自定义项11，string类型
            //DomHead[0]["cvendefine12"] = ""; //供应商自定义项12，string类型
            //DomHead[0]["cvendefine13"] = ""; //供应商自定义项13，string类型
            //DomHead[0]["cvendefine14"] = ""; //供应商自定义项14，string类型
            //DomHead[0]["cvendefine15"] = ""; //供应商自定义项15，string类型
            //DomHead[0]["cvendefine16"] = ""; //供应商自定义项16，string类型
            //DomHead[0]["idiscounttaxtype"] = ""; //扣税类别，int类型
            //DomHead[0]["ibilltype"] = ""; //单据类型，int类型
            //DomHead[0]["cvenpuomprotocol"] = ""; //收付款协议编码，string类型
            //DomHead[0]["cvenpuomprotocolname"] = ""; //收付款协议名称，string类型

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strRetMsg = "";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRetMsg = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRetMsg = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRetMsg = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRetMsg;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.String，此参数按值传递，表示错误描述：空，正确；非空，错误
            System.String result = broker.GetReturnValue() as System.String;
            if (result != null && result != string.Empty)
            {
                broker.Release();
                return "失败！" + result;
            }
            //结束本次调用，释放API资源
            broker.Release();

            return "";
        }
        #endregion
        #region 产成品入库API
        public string ProductInstorage(ADODB.Connection oCon, DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strPKValue)
        {
            if (ds.Tables[0].DefaultView.Count == 0 || ds.Tables[1].DefaultView.Count == 0)
            {
                return "API接口传入的零件成品入库数据错误，数据行数为0!";
            }
            DataSet dsUser = new DataSet();
            try
            {
                dsUser = CustomizableDesignBLL.GetData("select * from UFSystem..UA_User where cUser_Id='" + sUserID + "'");
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            //生产订单获取
            string MOID = "";
            for (int i = 0; i < ds.Tables[1].DefaultView.Count; i++)
            {
                if (MOID != "") MOID += ",";
                MOID += "'" + ds.Tables[1].DefaultView[i]["MOID"].ToString() + "'";
            }
            DataSet dsmom = new DataSet();
            string sql = "select a.*,b.MDeptCode,b.modid,b.sotype,b.socode,b.SoDId from " + strYongYouDBName + ".dbo.mom_order a inner join " + strYongYouDBName + ".dbo.mom_orderdetail b on a.moid=b.moid where a.MoId in(" + MOID + ")";
            try
            {
                dsmom = CustomizableDesignBLL.GetData(sql);
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

            // 返回值
            string strRet = "";
            string bz = ds.Tables[0].DefaultView[0]["BZ"].ToString();
            int index1 = bz.IndexOf('(');
            int index2 = bz.IndexOf(')');
            string bzcode = bz.Substring(index1 + 1, index2 - index1 - 1);
            //
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_" + strZT + "_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //
            #region 构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                strRet = "登录失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/ProductIn/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ProductIn/Add");
            #endregion

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：10
            broker.AssignNormalValue("sVouchType", "10");

            //给BO表头参数DomHead赋值，此BO参数的业务类型为产成品入库单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            DomHead[0]["ccode"] = "CPRK" + DateTime.Now.ToString("yyyyMMdd") + "0001"; //入库单号，string类型  这个会自动生成 输了也白输 --sqg
            DomHead[0]["ddate"] = dtCreateDate.ToString("yyyy-MM-dd"); //入库日期，DateTime类型


            //DomHead[0]["iproorderid"] = ds.Tables[0].DefaultView[0]["MoId"].ToString(); //生产订单ID，string类型
            //DomHead[0]["cmpocode"] = ds.Tables[0].DefaultView[0]["scCode"].ToString(); //生产订单号，string类型 入库类型
            DomHead[0]["cwhcode"] = ds.Tables[0].DefaultView[0]["cWhCode"].ToString(); //仓库编码，string类型
            DomHead[0]["cwhname"] = ds.Tables[0].DefaultView[0]["cWhName"].ToString(); //仓库，string类型
           // DomHead[0]["btransflag"] = "0";
            DomHead[0]["iverifystate"] = "0"; //iverifystate，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，string类型
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            DomHead[0]["cmemo"] = "PDA生成"; //备注，string类型
            //DomHead[0]["cmaker"] = ds.Tables[0].DefaultView[0]["UserName"].ToString(); //制单人，string类型
            DomHead[0]["cmaker"] = dsUser.Tables[0].DefaultView[0]["cUser_Name"].ToString();
            DomHead[0]["cbustype"] = "成品入库"; //业务类型，int类型
            DomHead[0]["csource"] = "生产订单"; //单据来源，int类型
            DomHead[0]["brdflag"] = "1"; //收发标志，string类型
            DomHead[0]["cvouchtype"] = "10"; //单据类型，string类型
            DomHead[0]["crdcode"] = "102"; //入库类别编码，string类型
            DomHead[0]["cdepcode"] = dsmom.Tables[0].DefaultView[0]["MDeptCode"].ToString();
            DomHead[0]["vt_id"] = "63"; //模版号，int类型
            //中间数据库表的主键
            DomHead[0]["cdefine10"] = ds.Tables[1].DefaultView[0]["SerialID"].ToString();
            #region 暂时没用的
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型
            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            ////DomHead[0]["dchkdate"] = ""; //检验日期，DateTime类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["cpspcode"] = ""; //产品，string类型
            //DomHead[0]["cprobatch"] = ""; //生产批号，string类型


            //DomHead[0]["cdepname"] = ""; //部门，string类型
            //DomHead[0]["crdname"] = ""; //入库类别，string类型
            //DomHead[0]["dveridate"] = ""; //审核日期，DateTime类型

            //DomHead[0]["cchkperson"] = ""; //检验员，string类型

            //DomHead[0]["chandler"] = ""; //审核人，string类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型

            //DomHead[0]["cpersonname"] = ""; //业务员，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            // DomHead[0]["csource"] = "库存"; //单据来源，int类型  空白的

            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型

            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            //DomHead[0]["cdefine10"] = ""; //表头自定义项10，string类型

            //DomHead[0]["cpersoncode"] = ""; //业务员编码，string类型

            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            #endregion
            //给BO表体参数domBody赋值，此BO参数的业务类型为产成品入库单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = ds.Tables[1].DefaultView.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            for (int iRow = 0; iRow < ds.Tables[1].DefaultView.Count; iRow++)
            {
                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = "0"; //主关键字段，int类型
                domBody[iRow]["cinvcode"] = ds.Tables[1].DefaultView[iRow]["cInvCode"].ToString(); //产品编码，string类型
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                //
                domBody[iRow]["cdefine34"] = ds.Tables[1].DefaultView[iRow]["SerialID"].ToString(); //表体自定义项3，string类型
                if (ds.Tables[1].DefaultView[iRow]["MoID"].ToString() != "")
                {
                    DataRow[] dr = dsmom.Tables[0].Select("MOID=" + ds.Tables[1].DefaultView[iRow]["MoID"].ToString());
                    if (dr.Length > 0)
                        domBody[iRow]["cmocode"] = dr[0]["MoCode"].ToString();
                    //生产订单号，string类型
                }
                domBody[iRow]["impoids"] = ds.Tables[1].DefaultView[iRow]["MoDId"].ToString(); //生产订单子表ID，int类型
                domBody[iRow]["imoseq"] = ds.Tables[1].DefaultView[iRow]["MoRowNo"].ToString();  //生产订单行号，string类型
                domBody[iRow]["cdefine25"] = ds.Tables[1].DefaultView[iRow]["SerialID"].ToString();
                decimal decSCQuantity = ds.Tables[1].DefaultView[iRow]["qty"] == DBNull.Value ? 0 : (decimal)ds.Tables[1].DefaultView[iRow]["qty"];
                // domBody[iRow]["inquantity"] = Trade.DBUtility.Common.decimalEx.RoundEx(decSCQuantity, 2); //应收数量，double类型 生产订单数量
                // domBody[iRow]["cbatchproperty8"] = ds.Tables["T_PartInstorageProduct"].DefaultView[iRow]["LuCode"].ToString();  //批次属性8，string类型  炉批号
                decimal decLZQuantity = ds.Tables[1].DefaultView[iRow]["qty"] == DBNull.Value ? 0 : (decimal)ds.Tables[1].DefaultView[iRow]["qty"];
                domBody[iRow]["iquantity"] = Trade.DBUtility.Common.decimalEx.RoundEx(decLZQuantity, 2); //数量，double类型
                domBody[iRow]["cbatch"] = ds.Tables[1].DefaultView[iRow]["cBatch"].ToString();  //批号，string类型
                //domBody[iRow]["cposition"] = ds.Tables["T_PartInstorageProduct"].DefaultView[iRow]["PostCode"].ToString();  //货位编码，string类型
                domBody[iRow]["id"] = "0"; //与主表关联项，int类型
                domBody[iRow]["irowno"] = iRow + 1; //行号，string类型
                //
                //domBody[iRow]["cname"] = ds.Tables["T_PartInstorageProduct"].DefaultView[iRow]["CostItemName"].ToString(); //项目，string类型
                //domBody[iRow]["citemcode"] = ds.Tables["T_PartInstorageProduct"].DefaultView[iRow]["CostItemCode"].ToString();//项目编码，string类型

                //domBody[iRow]["iopseq"] = ds.Tables["T_PartInstorageProduct"].DefaultView[iRow]["OpSeq"].ToString(); //工序行号，string类型
                //domBody[iRow]["copdesc"] = ds.Tables["T_PartInstorageProduct"].DefaultView[iRow]["Description"].ToString(); //工序说明，string类型
                //
                //domBody[iRow]["citem_class"] = "12"; //项目大类编码，string类型
                // domBody[iRow]["citemcname"] = "成本对象"; //项目大类名称，string类型
                domBody[iRow]["bcosting"] = "1"; //是否核算，string类型
                domBody[iRow]["cmworkcentercode"] = "0015"; //工作中心编码，string类型
                domBody[iRow]["isotype"] = "0"; //需求跟踪方式，int类型
                domBody[iRow]["bvmiused"] = "0"; //代管消耗标识，int类型
                domBody[iRow]["iordertype"] = "0"; //销售订单类别，int类型
                domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                domBody[iRow]["cdefine30"] = bzcode;
                domBody[iRow]["iinvsncount"] = Convert.ToInt64(decLZQuantity);

                //增加需求分类关联号
                if (ds.Tables[1].DefaultView[iRow]["MoID"].ToString() != "")
                {
                    DataRow[] dr = dsmom.Tables[0].Select("MODID=" + ds.Tables[1].DefaultView[iRow]["MoDId"].ToString());
                    if (dr.Length > 0)
                    {
                        domBody[iRow]["isotype"] = dr[0]["sotype"].ToString();
                        domBody[iRow]["csocode"] = dr[0]["socode"].ToString();
                        domBody[iRow]["isodid"] = dr[0]["SoDId"].ToString();
                    }
                    //生产订单号，string类型
                }

                #region 暂时不需要注视掉
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["cbaccounter"] = ""; //记账人，string类型
                //domBody[iRow]["ccheckcode"] = ""; //检验单号，string类型
                //domBody[iRow]["icheckidbaks"] = ""; //检验单子表id，string类型
                //domBody[iRow]["crejectcode"] = ""; //不良品处理单号，string类型
                //domBody[iRow]["irejectids"] = ""; //不良品处理单id，string类型
                //domBody[iRow]["ccheckpersonname"] = ""; //检验员，string类型
                //domBody[iRow]["dcheckdate"] = ""; //检验日期，string类型
                //domBody[iRow]["ccheckpersoncode"] = ""; //检验员编码，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["outcopiedquantity"] = ""; //已复制数量，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["cbmemo"] = ""; //备注，string类型

                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["cservicecode"] = ""; //服务单号，string类型
                //domBody[iRow]["cplanlotcode"] = ""; //计划批号，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型
                //domBody[iRow]["iinvsncount"] = ""; //已指定序列号量，string类型

                /***************************** 以下是非必输字段 ****************************/

                //domBody[iRow]["cinvaddcode"] = ""; //产品代码，string类型
                //domBody[iRow]["cinvname"] = ""; //产品名称，string类型
                //domBody[iRow]["cinvstd"] = ""; //规格型号，string类型
                //domBody[iRow]["cinvm_unit"] = ""; //主计量单位，string类型
                //domBody[iRow]["cinva_unit"] = ""; //库存单位，string类型
                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型

                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，double类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，double类型
                //domBody[iRow]["cfree2"] = ""; //存货自由项2，string类型

                //domBody[iRow]["iinvexchrate"] = ""; //换算率，double类型
                //domBody[iRow]["inum"] = ""; //件数，double类型

                //domBody[iRow]["iunitcost"] = ""; //单价，double类型
                //domBody[iRow]["iprice"] = ""; //金额，double类型
                //domBody[iRow]["ipunitcost"] = ""; //计划单价，double类型
                //domBody[iRow]["ipprice"] = ""; //计划金额，double类型
                //domBody[iRow]["dvdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["isoutquantity"] = ""; //累计出库数量，double类型
                //domBody[iRow]["isoutnum"] = ""; //累计出库件数，double类型
                //domBody[iRow]["dsdate"] = ""; //结算日期，DateTime类型
                //domBody[iRow]["ifquantity"] = ""; //实际数量，double类型
                //domBody[iRow]["ifnum"] = ""; //实际件数，double类型
                //domBody[iRow]["cvouchcode"] = ""; //对应入库单id，string类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，double类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，double类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，double类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型

                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，DateTime类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型

                //domBody[iRow]["innum"] = ""; //应收件数，double类型
                //domBody[iRow]["dmadedate"] = ""; //生产日期，DateTime类型

                //domBody[iRow]["icheckids"] = ""; //检验单子表ID，int类型
                //domBody[iRow]["isodid"] = ""; //销售订单子表ID，string类型

                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //domBody[iRow]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["cposname"] = ""; //货位，string类型
                //domBody[iRow]["cmolotcode"] = ""; //生产批号，string类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型

                //domBody[iRow]["cvmivencode"] = ""; //代管商代码，string类型
                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型

                //domBody[iRow]["ivmisettlequantity"] = ""; //代管挂账确认单数量，double类型
                //domBody[iRow]["ivmisettlenum"] = ""; //代管挂账确认单件数，double类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型

                //domBody[iRow]["iorderdid"] = ""; //iorderdid，int类型
                //domBody[iRow]["iordercode"] = ""; //销售订单号，string类型
                //domBody[iRow]["iorderseq"] = ""; //销售订单行号，string类型

                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，string类型
                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["ibondedsumqty"] = ""; //累计保税处理抽取数量，string类型

                //domBody[iRow]["cmworkcenter"] = ""; //工作中心，string类型

                //domBody[iRow]["cdefine34"] = ""; //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["itrids"] = ""; //特殊单据子表标识，double类型
                //domBody[iRow]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //表体自定义项6，double类型
                #endregion
            }

            //
            #region 调用API处理

            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            broker.AssignNormalValue("cnnFrom", oCon);

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRet = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRet = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRet = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRet;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return "失败！" + errMsgRet;
            }
            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();

            #endregion
            return strRet;
        }
        #endregion

        #region DJ 采购入库API
        public class DispatchEntity
        {
            private string domHead;
            private string domBody;
            private string voucherid;

            public string Voucherid
            {
                get { return voucherid; }
                set { voucherid = value; }
            }

            public string DomHead
            {
                get { return domHead; }
                set { domHead = value; }
            }

            public string DomBody
            {
                get { return domBody; }
                set { domBody = value; }
            }
        }
      //采购入库单装载
        private bool LoadOtherInOrder(DispatchEntity orderEntity, U8Login.clsLogin loginObj)
        {
            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = loginObj;

            //第三步：设置API地址标识(Url)
            //当前API：装载单据的地址标识为：U8API/otherin/Load
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/PuStoreIn/Load");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型:09
            broker.AssignNormalValue("sVouchType", "01");

            //给普通参数sWhere赋值。此参数的数据类型为System.String，此参数按值传递，表示条件串            
            bool bBank = false;
            if (string.IsNullOrEmpty(orderEntity.Voucherid))
            {
                broker.AssignNormalValue("sWhere", string.Empty);
                bBank = true;
            }
            else
            {
                broker.AssignNormalValue("sWhere", "id=" + orderEntity.Voucherid);
            }

            //该参数domPos为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domPos = new MSXML2.DOMDocumentClass();
            broker.AssignNormalValue("domPos", domPos);

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数bGetBlank赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否获取空白单据:传入false
            broker.AssignNormalValue("bGetBlank", bBank);

            //给普通参数sBodyWhere_Order赋值。此参数的数据类型为System.String，此参数按值传递，表示表体排序方式字段
            broker.AssignNormalValue("sBodyWhere_Order", "");
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        throw new Exception("系统异常：" + sysEx.Message);
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        throw new Exception("API异常：" + bizEx.Message);
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        throw new Exception("异常原因：" + exReason);
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return false;
            }
            //第七步：获取返回结果
            MSXML2.DOMDocument domHeadRet = broker.GetResult("DomHead") as MSXML2.DOMDocument;
            MSXML2.DOMDocument domBodyRet = broker.GetResult("domBody") as MSXML2.DOMDocument;

            orderEntity.DomHead = domHeadRet.xml;
            orderEntity.DomBody = domBodyRet.xml;
            System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            if (errMsgRet != null)
            {
                throw new Exception("异常原因：" + errMsgRet);
                // return false;
            }
            //结束本次调用，释放API资源
            broker.Release();
            return true;
        }

        public string CGRKAdd_XML(ADODB.Connection oCon, DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strPKValue, string tm)
        {


            if (ds.Tables[0].DefaultView.Count == 0 || ds.Tables[1].DefaultView.Count == 0)
            {
                return "API接口传入的零件成品入库数据错误，数据行数为0!";
            }
            DataSet dsUser = new DataSet();
            try
            {
                dsUser = CustomizableDesignBLL.GetData("select * from UFSystem..UA_User where cUser_Id='" + sUserID + "'");
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

            // 返回值
            string strRet = "";
            //string bz = ds.Tables[0].DefaultView[0]["BZ"].ToString();
            //int index1 = bz.IndexOf('(');
            //int index2 = bz.IndexOf(')');
            //string bzcode = bz.Substring(index1 + 1, index2 - index1 - 1);
            //
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_" + strZT + "_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //
            #region 构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                strRet = "登录失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }
           
            //oCon.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
            //oCon.ConnectionString = u8Login.UfDbName;
            //oCon.Open();
            //
            IXMLDOMDocument2 domHead = new MSXML2.DOMDocument();
            IXMLDOMDocument2 domBody = new MSXML2.DOMDocument();
            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/ProductIn/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/PuStoreIn/Add");
            #endregion

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：10
            broker.AssignNormalValue("sVouchType", "01");

            //给BO表头参数DomHead赋值，此BO参数的业务类型为产成品入库单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass());

           // DispatchEntity orderEntity = new DispatchEntity();
            //orderEntity.Voucherid = dsData.Tables[0].DefaultView[0]["ID"].ToString();
           // LoadOtherInOrder(orderEntity, u8Login);
            ADODB.Recordset rs = new ADODB.Recordset();

            //MSXML2DomWraper domHeadWraper = new MSXML2DomWraper(orderEntity.DomHead);
            //MSXML2DomWraper domBodyWraper = new MSXML2DomWraper(orderEntity.DomBody);

            string strSQL = "select a.* from zpurRkdHead a   where 1=0";
            rs.Open(strSQL, oCon, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 0);
            rs.Save(domHead, ADODB.PersistFormatEnum.adPersistXML);
            rs.Close();
            MSXML2DomWraper domHeadWraper = new MSXML2DomWraper(domHead.xml);
            MSXML2.IXMLDOMNode rootNode = domHeadWraper.selectSingleNode("//rs:data");
            MSXML2.IXMLDOMElement tmpNode = null;

            int ccode = 1000000001;

            tmpNode = domHeadWraper.createElement("z:row");
            domHeadWraper.SetCurDomElement(tmpNode);
            domHeadWraper.SetAttribute("id", "0");
            domHeadWraper.SetAttribute("ccode", ccode);
            domHeadWraper.SetAttribute("ddate", dtCreateDate.ToString("yyyy-MM-dd"));
            domHeadWraper.SetAttribute("cwhcode", "0401");

            domHeadWraper.SetAttribute("btransflag", "0");
            domHeadWraper.SetAttribute("iverifystate", "0");
            domHeadWraper.SetAttribute("iswfcontrolled", "0");
            domHeadWraper.SetAttribute("ireturncount", "0");
            domHeadWraper.SetAttribute("cmemo", "PDA生成");
            domHeadWraper.SetAttribute("cmaker",dsUser.Tables[0].DefaultView[0]["cUser_Name"].ToString());
            domHeadWraper.SetAttribute("cbustype", "普通采购");
            domHeadWraper.SetAttribute("csource", "采购订单");
            domHeadWraper.SetAttribute("brdflag", "1"); //收发标志，int类型
            domHeadWraper.SetAttribute("cvouchtype", "01");
            domHeadWraper.SetAttribute("crdcode", "101");
            //domHeadWraper.SetAttribute("cdepcode", "10302");//部门

            domHeadWraper.SetAttribute("editprop", "A");
            domHeadWraper.SetAttribute("vt_id", "27");

            domHeadWraper.SetAttribute("cdefine10", tm);
            domHeadWraper.SetAttribute("iexchrate", "1");
            domHeadWraper.SetAttribute("cexch_name", "人民币");
            domHeadWraper.SetAttribute("cptcode", "01");
            domHeadWraper.SetAttribute("cvencode", ds.Tables["po_pomain"].DefaultView[0]["cvencode"].ToString());
            //domHeadWraper.SetAttribute("dnmaketime", loginObj.CurDate);
            string itaxrate = ds.Tables["po_pomain"].DefaultView[0]["itaxrate"].ToString();
            decimal itax = decimal.Parse(itaxrate);
            domHeadWraper.SetAttribute("itaxrate", itax.ToString("#0.000000"));
            domHeadWraper.SetAttribute("cordercode", ds.Tables["po_pomain"].DefaultView[0]["cpoid"].ToString());
            domHeadWraper.SetAttribute("ipurorderid", ds.Tables["po_pomain"].DefaultView[0]["poid"].ToString());
                  
            rootNode.appendChild(tmpNode);

            //生成其它出库单表体
            strSQL = "select * from zpurRkdTail  where 1=0";
            rs.Open(strSQL, oCon, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 0);
            rs.Save(domBody, ADODB.PersistFormatEnum.adPersistXML);
            rs.Close();

            MSXML2DomWraper domBodyWraper = new MSXML2DomWraper(domBody.xml);
            rootNode = domBodyWraper.selectSingleNode("//rs:data");

            for (int iRow = 0; iRow < ds.Tables["v_cginstorage"].DefaultView.Count; iRow++)
            {
                
                tmpNode = domHeadWraper.createElement("z:row");
                domBodyWraper.SetCurDomElement(tmpNode);
                domBodyWraper.SetAttribute("autoid", "0");
                domBodyWraper.SetAttribute("editprop", "A");
                domBodyWraper.SetAttribute("irowno", (iRow+1).ToString());
                domBodyWraper.SetAttribute("cinvcode", ds.Tables["v_cginstorage"].DefaultView[iRow]["cinvcode"].ToString());
                domBodyWraper.SetAttribute("cdefine33", ds.Tables["v_cginstorage"].DefaultView[iRow]["Define33"].ToString());
               
                domBodyWraper.SetAttribute("cdefine34", ds.Tables["v_cginstorage"].DefaultView[iRow]["id"].ToString());
                domBodyWraper.SetAttribute("iposid", ds.Tables["v_cginstorage"].DefaultView[iRow]["id"].ToString());
                domBodyWraper.SetAttribute("cdefine25",tm);
                decimal decLZQuantity = decimal.Parse(ds.Tables["v_cginstorage"].DefaultView[iRow]["iQuantity"].ToString());
                domBodyWraper.SetAttribute("inquantity", Trade.DBUtility.Common.decimalEx.RoundEx(decLZQuantity, 2));
                domBodyWraper.SetAttribute("iquantity", Trade.DBUtility.Common.decimalEx.RoundEx(decLZQuantity, 2));
                domBodyWraper.SetAttribute("cbatch",  ds.Tables["v_cginstorage"].DefaultView[iRow]["Define33"].ToString());//
                domBodyWraper.SetAttribute("id", "0");
                domBodyWraper.SetAttribute("chvencode", ds.Tables["po_pomain"].DefaultView[0]["cvencode"]);
                domBodyWraper.SetAttribute("bcosting", "1");
                domBodyWraper.SetAttribute("bvmiused", "0");
                domBodyWraper.SetAttribute("iordertype", "0");
                domBodyWraper.SetAttribute("iexpiratdatecalcu", "0");
                domBodyWraper.SetAttribute("iinvsncount", Convert.ToInt64(decLZQuantity));
                domBodyWraper.SetAttribute("cpoid", strPKValue);
                decimal price = decimal.Parse(ds.Tables["v_cginstorage"].DefaultView[iRow]["iTaxPrice"].ToString());
                decimal wsprice = price / (itax / 100 + 1);
                decimal sum = Math.Round(price * decLZQuantity,2);
                decimal wssum = Math.Round(wsprice * decLZQuantity,2);


                domBodyWraper.SetAttribute("iunitcost", wsprice.ToString("#0.000000"));
                domBodyWraper.SetAttribute("ioritaxcost", price.ToString("#0.000000"));
                domBodyWraper.SetAttribute("ioricost", wsprice.ToString("#0.000000"));
                domBodyWraper.SetAttribute("iorimoney", wssum.ToString("#0.00"));
                domBodyWraper.SetAttribute("ioritaxprice", (sum - wssum).ToString("#0.00"));
                domBodyWraper.SetAttribute("iorisum", sum.ToString("#0.00"));
                domBodyWraper.SetAttribute("itaxrate", itax.ToString("#0.000000"));
                domBodyWraper.SetAttribute("itaxprice", (sum - wssum).ToString("#0.00"));
                domBodyWraper.SetAttribute("isum", sum.ToString("#0.00"));
                domBodyWraper.SetAttribute("iprice", wssum.ToString("#0.00"));


                //
                //增加需求分类关联号
                if (ds.Tables["v_cginstorage"].DefaultView[iRow]["id"].ToString() != "")
                {
                    DataRow[] dr = ds.Tables["po_podetails"].Select("id=" + ds.Tables["v_cginstorage"].DefaultView[iRow]["id"].ToString());
                    if (dr.Length > 0)
                    {
                        domBodyWraper.SetAttribute("isotype", dr[0]["sotype"].ToString());
                        domBodyWraper.SetAttribute("csocode", dr[0]["csocode"].ToString());
                        domBodyWraper.SetAttribute("isodid", dr[0]["sodid"].ToString());
                    }
                    //生产订单号，string类型
                }
               

                rootNode.appendChild(tmpNode);
            }

            //给BO表体参数domBody赋值，此BO参数的业务类型为销售发货单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())
            broker.AssignNormalValue("DomHead", domHeadWraper.XmlDom);
            broker.AssignNormalValue("domBody", domBodyWraper.XmlDom);


            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExceptionMsg = "";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExceptionMsg = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExceptionMsg = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExceptionMsg = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                throw new Exception(strExceptionMsg);
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                throw new Exception("新增失败！" + errMsgRet);
            }
            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return "";
        }

        public string CGInstorage(ADODB.Connection oCon, DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strPKValue, string tm)
        {
            if (ds.Tables[0].DefaultView.Count == 0 || ds.Tables[1].DefaultView.Count == 0)
            {
                return "API接口传入的零件成品入库数据错误，数据行数为0!";
            }
            DataSet dsUser = new DataSet();
            try
            {
                dsUser = CustomizableDesignBLL.GetData("select * from UFSystem..UA_User where cUser_Id='" + sUserID + "'");
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

            // 返回值
            string strRet = "";
            //string bz = ds.Tables[0].DefaultView[0]["BZ"].ToString();
            //int index1 = bz.IndexOf('(');
            //int index2 = bz.IndexOf(')');
            //string bzcode = bz.Substring(index1 + 1, index2 - index1 - 1);
            //
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_" + strZT + "_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //
            #region 构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                strRet = "登录失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/ProductIn/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/PuStoreIn/Add");
            #endregion

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：10
            broker.AssignNormalValue("sVouchType", "01");

            //给BO表头参数DomHead赋值，此BO参数的业务类型为产成品入库单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            DomHead[0]["ccode"] = "CGRK" + DateTime.Now.ToString("yyyyMMdd") + "0001"; //入库单号，string类型  这个会自动生成 输了也白输 --sqg
            DomHead[0]["ddate"] = dtCreateDate.ToString("yyyy-MM-dd"); //入库日期，DateTime类型
            DomHead[0]["cwhcode"] = "003";// ds.Tables[0].DefaultView[0]["cWhCode"].ToString(); //仓库编码，string类型
            //DomHead[0]["cwhname"] = ds.Tables[0].DefaultView[0]["cWhName"].ToString(); //仓库，string类型
            DomHead[0]["btransFlag"] = "0";
            DomHead[0]["iverifystate"] = "0"; //iverifystate，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，string类型
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            DomHead[0]["cmemo"] = "PDA生成"; //备注，string类型
            //DomHead[0]["cmaker"] = ds.Tables[0].DefaultView[0]["UserName"].ToString(); //制单人，string类型
            DomHead[0]["cmaker"] = dsUser.Tables[0].DefaultView[0]["cUser_Name"].ToString();
            DomHead[0]["cbustype"] = "普通采购"; //业务类型，int类型
            DomHead[0]["csource"] = "采购订单"; //单据来源，int类型
            DomHead[0]["brdflag"] = "1"; //收发标志，string类型
            DomHead[0]["cvouchtype"] = "01"; //单据类型，string类型
            DomHead[0]["crdcode"] = "101"; //入库类别编码，string类型
            DomHead[0]["cdepcode"] = "10302"; //部门编码，string类型
            DomHead[0]["vt_id"] = "27"; //模版号，int类型
            //中间数据库表的主键
            DomHead[0]["cdefine10"] = tm;
            DomHead[0]["cexch_name"] = "人民币";
            DomHead[0]["iexchrate"] = "1";
            DomHead[0]["cptcode"] = "01";
            //cVenCode 
            DomHead[0]["cvencode"] = ds.Tables["po_pomain"].DefaultView[0]["cvencode"];
            string itaxrate = ds.Tables["po_pomain"].DefaultView[0]["itaxrate"].ToString();
            decimal itax = decimal.Parse(itaxrate);
            DomHead[0]["itaxrate"] = itax.ToString("#0.000000"); //税率，double类型
            DomHead[0]["cordercode"] = ds.Tables["po_pomain"].DefaultView[0]["cpoid"].ToString();
            DomHead[0]["ipurorderid"] = ds.Tables["po_pomain"].DefaultView[0]["poid"].ToString(); //采购订单ID，string类型


            #region 暂时没用的
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型
            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            ////DomHead[0]["dchkdate"] = ""; //检验日期，DateTime类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["cpspcode"] = ""; //产品，string类型
            //DomHead[0]["cprobatch"] = ""; //生产批号，string类型


            //DomHead[0]["cdepname"] = ""; //部门，string类型
            //DomHead[0]["crdname"] = ""; //入库类别，string类型
            //DomHead[0]["dveridate"] = ""; //审核日期，DateTime类型

            //DomHead[0]["cchkperson"] = ""; //检验员，string类型

            //DomHead[0]["chandler"] = ""; //审核人，string类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型

            //DomHead[0]["cpersonname"] = ""; //业务员，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            // DomHead[0]["csource"] = "库存"; //单据来源，int类型  空白的

            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型

            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            //DomHead[0]["cdefine10"] = ""; //表头自定义项10，string类型

            //DomHead[0]["cpersoncode"] = ""; //业务员编码，string类型

            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            #endregion
            //给BO表体参数domBody赋值，此BO参数的业务类型为产成品入库单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = ds.Tables[1].DefaultView.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            for (int iRow = 0; iRow < ds.Tables["v_cginstorage"].DefaultView.Count; iRow++)
            {
                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = "0"; //主关键字段，int类型
                domBody[iRow]["cinvcode"] = ds.Tables["v_cginstorage"].DefaultView[iRow]["cinvcode"].ToString(); //产品编码，string类型
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                //
                domBody[iRow]["cdefine34"] = ds.Tables["v_cginstorage"].DefaultView[iRow]["id"].ToString(); //表体自定义项3，string类型
                //if (ds.Tables[1].DefaultView[iRow]["MoID"].ToString() != "")
                //{
                //    DataRow[] dr = dsmom.Tables[0].Select("MOID=" + ds.Tables[1].DefaultView[iRow]["MoID"].ToString());
                //    if (dr.Length > 0)
                //        domBody[iRow]["cmocode"] = dr[0]["MoCode"].ToString();
                //    //生产订单号，string类型
                //}
                domBody[iRow]["iposid"] = ds.Tables["v_cginstorage"].DefaultView[iRow]["id"].ToString(); //采购订单子表ID，int类型

                domBody[iRow]["cdefine25"] = tm;
                //decimal decSCQuantity = ds.Tables["v_cginstorage"].DefaultView[iRow]["iQuantity"] == DBNull.Value ? 0 : (decimal)ds.Tables["v_cginstorage"].DefaultView[iRow]["iQuantity"];
                // domBody[iRow]["inquantity"] = Trade.DBUtility.Common.decimalEx.RoundEx(decSCQuantity, 2); //应收数量，double类型 生产订单数量
                // domBody[iRow]["cbatchproperty8"] = ds.Tables["T_PartInstorageProduct"].DefaultView[iRow]["LuCode"].ToString();  //批次属性8，string类型  炉批号
                decimal decLZQuantity = decimal.Parse(ds.Tables["v_cginstorage"].DefaultView[iRow]["iQuantity"].ToString());
                domBody[iRow]["iquantity"] = Trade.DBUtility.Common.decimalEx.RoundEx(decLZQuantity, 2); //数量，double类型
                domBody[iRow]["inquantity"] = Trade.DBUtility.Common.decimalEx.RoundEx(decLZQuantity, 2); //数量，double类型
                domBody[iRow]["cbatch"] = "WDD";//ds.Tables["v_cginstorage"].DefaultView[iRow]["Define33"].ToString();  //批号，string类型
                //domBody[iRow]["cposition"] = ds.Tables["T_PartInstorageProduct"].DefaultView[iRow]["PostCode"].ToString();  //货位编码，string类型
                domBody[iRow]["id"] = "0"; //与主表关联项，int类型
                domBody[iRow]["irowno"] = iRow + 1; //行号，string类型
                domBody[iRow]["chvencode "] = ds.Tables["po_pomain"].DefaultView[0]["cvencode"]; //行号，string类型

                domBody[iRow]["bcosting"] = "1"; //是否核算，string类型
                //domBody[iRow]["cmworkcentercode"] = "0015"; //工作中心编码，string类型
                domBody[iRow]["isotype"] = "0"; //需求跟踪方式，int类型
                domBody[iRow]["bvmiused"] = "0"; //代管消耗标识，int类型
                domBody[iRow]["iordertype"] = "0"; //销售订单类别，int类型
                domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                //domBody[iRow]["cDefine30"] = bzcode;
                domBody[iRow]["iinvsncount"] = Convert.ToInt64(decLZQuantity);

                domBody[iRow]["cpoid"] = strPKValue; //订单号，string类型

                decimal price = decimal.Parse(ds.Tables["v_cginstorage"].DefaultView[iRow]["iTaxPrice"].ToString());
                decimal wsprice = price / (itax / 100 + 1);
                decimal sum = price * decLZQuantity;
                decimal wssum = wsprice * decLZQuantity;

                domBody[iRow]["iunitcost"] = wsprice.ToString("#0.000000"); //单价，double类型
                domBody[iRow]["ioritaxcost"] = price.ToString("#0.000000"); //原币含税单价，double类型
                domBody[iRow]["ioricost"] = wsprice.ToString("#0.000000"); //原币单价，double类型
                domBody[iRow]["iorimoney"] = wssum.ToString("#0.000000"); //原币金额，double类型
                domBody[iRow]["ioritaxprice"] = (sum - wssum).ToString("#0.000000"); //原币税额，double类型
                domBody[iRow]["iorisum"] = sum.ToString("#0.000000"); //原币价税合计，double类型
                domBody[iRow]["itaxrate"] = itax.ToString("#0.000000"); //税率，double类型
                domBody[iRow]["itaxprice"] = (sum - wssum).ToString("#0.000000"); //本币税额，double类型
                domBody[iRow]["isum"] = sum.ToString("#0.000000"); //本币价税合计，double类型
                //domBody[iRow]["itax"] = "";//税额
                domBody[iRow]["iprice"] = wssum.ToString("#0.000000"); //本币金额
                #region 暂时不需要注视掉
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["cbaccounter"] = ""; //记账人，string类型
                //domBody[iRow]["ccheckcode"] = ""; //检验单号，string类型
                //domBody[iRow]["icheckidbaks"] = ""; //检验单子表id，string类型
                //domBody[iRow]["crejectcode"] = ""; //不良品处理单号，string类型
                //domBody[iRow]["irejectids"] = ""; //不良品处理单id，string类型
                //domBody[iRow]["ccheckpersonname"] = ""; //检验员，string类型
                //domBody[iRow]["dcheckdate"] = ""; //检验日期，string类型
                //domBody[iRow]["ccheckpersoncode"] = ""; //检验员编码，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["outcopiedquantity"] = ""; //已复制数量，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["cbmemo"] = ""; //备注，string类型

                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["cservicecode"] = ""; //服务单号，string类型
                //domBody[iRow]["cplanlotcode"] = ""; //计划批号，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型
                //domBody[iRow]["iinvsncount"] = ""; //已指定序列号量，string类型

                /***************************** 以下是非必输字段 ****************************/

                //domBody[iRow]["cinvaddcode"] = ""; //产品代码，string类型
                //domBody[iRow]["cinvname"] = ""; //产品名称，string类型
                //domBody[iRow]["cinvstd"] = ""; //规格型号，string类型
                //domBody[iRow]["cinvm_unit"] = ""; //主计量单位，string类型
                //domBody[iRow]["cinva_unit"] = ""; //库存单位，string类型
                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型

                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，double类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，double类型
                //domBody[iRow]["cfree2"] = ""; //存货自由项2，string类型

                //domBody[iRow]["iinvexchrate"] = ""; //换算率，double类型
                //domBody[iRow]["inum"] = ""; //件数，double类型

                //domBody[iRow]["iunitcost"] = ""; //单价，double类型
                //domBody[iRow]["iprice"] = ""; //金额，double类型
                //domBody[iRow]["ipunitcost"] = ""; //计划单价，double类型
                //domBody[iRow]["ipprice"] = ""; //计划金额，double类型
                //domBody[iRow]["dvdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["isoutquantity"] = ""; //累计出库数量，double类型
                //domBody[iRow]["isoutnum"] = ""; //累计出库件数，double类型
                //domBody[iRow]["dsdate"] = ""; //结算日期，DateTime类型
                //domBody[iRow]["ifquantity"] = ""; //实际数量，double类型
                //domBody[iRow]["ifnum"] = ""; //实际件数，double类型
                //domBody[iRow]["cvouchcode"] = ""; //对应入库单id，string类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，double类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，double类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，double类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型

                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，DateTime类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型

                //domBody[iRow]["innum"] = ""; //应收件数，double类型
                //domBody[iRow]["dmadedate"] = ""; //生产日期，DateTime类型

                //domBody[iRow]["icheckids"] = ""; //检验单子表ID，int类型
                //domBody[iRow]["isodid"] = ""; //销售订单子表ID，string类型

                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //domBody[iRow]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["cposname"] = ""; //货位，string类型
                //domBody[iRow]["cmolotcode"] = ""; //生产批号，string类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型

                //domBody[iRow]["cvmivencode"] = ""; //代管商代码，string类型
                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型

                //domBody[iRow]["ivmisettlequantity"] = ""; //代管挂账确认单数量，double类型
                //domBody[iRow]["ivmisettlenum"] = ""; //代管挂账确认单件数，double类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型

                //domBody[iRow]["iorderdid"] = ""; //iorderdid，int类型
                //domBody[iRow]["iordercode"] = ""; //销售订单号，string类型
                //domBody[iRow]["iorderseq"] = ""; //销售订单行号，string类型

                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，string类型
                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["ibondedsumqty"] = ""; //累计保税处理抽取数量，string类型

                //domBody[iRow]["cmworkcenter"] = ""; //工作中心，string类型

                //domBody[iRow]["cdefine34"] = ""; //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["itrids"] = ""; //特殊单据子表标识，double类型
                //domBody[iRow]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //表体自定义项6，double类型
                #endregion
            }

            //
            #region 调用API处理

            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            broker.AssignNormalValue("cnnFrom", oCon);

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRet = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRet = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRet = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRet;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return "失败！" + errMsgRet;
            }
            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();

            #endregion
            return strRet;
        }
       
        #endregion
        #region 生成流转卡完工单API  同时回刷 生产计划单和流转卡单据明细信息
        public string LiuZhuanKaWanGong(DataSet dsLZK, string strZT, string strYongYouDBName, string strPKValue, DataSet dsInStorage)
        {
            List<DataTableName> dtnWWList = new List<DataTableName>();
            DataTableName dtnWW = new DataTableName();
            dtnWW.strSelectSQL = "SELECT * FROM " + strYongYouDBName + ".DBO.sfc_pfreport WHERE 1=2 ";
            dtnWW.strTableName = "sfc_pfreport";
            dtnWWList.Add(dtnWW);
            //
            dtnWW = new DataTableName();
            dtnWW.strSelectSQL = "SELECT * FROM " + strYongYouDBName + ".DBO.sfc_pfreportdetail WHERE 1=2 ";
            dtnWW.strTableName = "sfc_pfreportdetail";
            dtnWWList.Add(dtnWW);
            string strYearMonth = DateTime.Now.ToString("yyyyMM");
            string strcSeed = strYearMonth;
            dtnWW = new DataTableName();
            dtnWW.strSelectSQL = "SELECT cNumber as Maxnumber FROM " + strYongYouDBName + ".DBO.VoucherHistory  with (NOLOCK)Where CardNumber='FC66' and cContent ='单据日期' and cSeed='" + strcSeed + "'";
            dtnWW.strTableName = "VoucherHistory";
            dtnWWList.Add(dtnWW);
            //
            DataSet dsWW = new DataSet();
            try
            {
                dsWW = CustomizableDesignBLL.GetData(dtnWWList, true);
            }
            catch (Exception ex)
            {
                return "读取来料报检单的表结构出错：" + ex.Message;
            }
            //
            #region 获取最大ID
            List<DataTableName> dtnMaxList = new List<DataTableName>();
            DataTableName dtnMaxID = new DataTableName();
            dtnMaxID.strSelectSQL = "SELECT max(PFReportId) ID FROM " + strYongYouDBName + ".DBO.sfc_pfreport";
            dtnMaxID.strTableName = "sfc_pfreport";
            dtnMaxList.Add(dtnMaxID);
            //
            dtnMaxID = new DataTableName();
            dtnMaxID.strSelectSQL = "SELECT max(PFReportDId) AutoID FROM " + strYongYouDBName + ".DBO.sfc_pfreportdetail";
            dtnMaxID.strTableName = "sfc_pfreportdetail";
            dtnMaxList.Add(dtnMaxID);

            DataSet dsUA_Identity = new DataSet();
            try
            {
                dsUA_Identity = CustomizableDesignBLL.GetData(dtnMaxList, false);
            }
            catch (Exception ex)
            {
                return "获取最大的编号出错：" + ex.Message;
            }
            int iFatherId = 0;
            int iChildID = 0;
            if (dsUA_Identity.Tables["sfc_pfreport"].DefaultView.Count > 0)
            {
                if (dsUA_Identity.Tables["sfc_pfreport"].DefaultView[0]["ID"] == DBNull.Value)
                    iFatherId = 0;
                else
                    iFatherId = Convert.ToInt32(dsUA_Identity.Tables["sfc_pfreport"].DefaultView[0]["ID"].ToString());
            }
            if (dsUA_Identity.Tables["sfc_pfreportdetail"].DefaultView.Count > 0)
            {
                if (dsUA_Identity.Tables["sfc_pfreportdetail"].DefaultView[0]["AutoID"] == DBNull.Value)
                    iChildID = 0;
                else
                    iChildID = Convert.ToInt32(dsUA_Identity.Tables["sfc_pfreportdetail"].DefaultView[0]["AutoID"].ToString());
            }
            #endregion
            int iMaxnumber = 0;

            if (dsWW.Tables["VoucherHistory"].DefaultView.Count > 0)
            {
                if (dsWW.Tables["VoucherHistory"].DefaultView[0]["Maxnumber"] != DBNull.Value)
                    iMaxnumber = Convert.ToInt32(dsWW.Tables["VoucherHistory"].DefaultView[0]["Maxnumber"].ToString());
            }
            iMaxnumber++;
            string strMaxNumber = iMaxnumber.ToString();
            while (strMaxNumber.Length < 5)
                strMaxNumber = "0" + strMaxNumber;
            strMaxNumber = DateTime.Now.ToString("yyyyMMdd") + strMaxNumber;
            if (dsWW.Tables["VoucherHistory"].DefaultView.Count > 0)
            {
                dsWW.Tables["VoucherHistory"].DefaultView[0]["Maxnumber"] = iMaxnumber;
                dsWW.Tables["VoucherHistory"].DefaultView[0].EndEdit();
            }
            else
            {
                DataRow drNewVoucherHistory = dsWW.Tables["VoucherHistory"].NewRow();
                drNewVoucherHistory["CardNumber"] = "FC66";
                drNewVoucherHistory["Maxnumber"] = iMaxnumber.ToString();
                drNewVoucherHistory["bEmpty"] = false;
                dsWW.Tables["VoucherHistory"].Rows.Add(drNewVoucherHistory);
            }
            #region 循环生成对应记录
            foreach (DataRowView drv in dsInStorage.Tables["T_PartInstorageProduct"].DefaultView)
            {
                iFatherId++;
                //
                string strPFId = drv["PFId"].ToString();
                //
                dsLZK.Tables["sfc_processflow"].DefaultView.RowFilter = " PFId='" + strPFId + "'";
                dsLZK.Tables["sfc_processflowdetail"].DefaultView.RowFilter = " PFId='" + strPFId + "'";
                //
                if (dsLZK.Tables["sfc_processflow"].DefaultView.Count > 0)
                {
                    DataRow drnew = dsWW.Tables["sfc_pfreport"].NewRow();
                    //
                    drnew["PFReportId"] = iFatherId;
                    drnew["DocCode"] = strMaxNumber;
                    drnew["DocDate"] = DateTime.Now.ToString("yyyy-MM-dd");
                    drnew["DocTime"] = DateTime.Now.ToString();
                    drnew["PFId"] = drv["PFId"];
                    drnew["MoDId"] = drv["MoDId"];
                    drnew["CreateDate"] = DateTime.Now.ToString();
                    drnew["CreateUser"] = dsInStorage.Tables[0].DefaultView[0]["CreaterName"].ToString();
                    drnew["CreateTime"] = DateTime.Now.ToString();
                    drnew["VTid"] = "131043";
                    drnew["Define1"] = "";
                    drnew["Define2"] = "";
                    drnew["Define3"] = "";
                    drnew["Define10"] = "";
                    drnew["Define11"] = "";
                    drnew["Define12"] = "";
                    drnew["Define13"] = "";
                    drnew["Define14"] = "";
                    drnew["UpdCount"] = 0;
                    //
                    dsWW.Tables["sfc_pfreport"].Rows.Add(drnew);
                }
                //
                if (dsLZK.Tables["sfc_processflowdetail"].DefaultView.Count > 0)
                {
                    for (int i = 0; i < dsLZK.Tables["sfc_processflowdetail"].DefaultView.Count; i++)
                    {
                        iChildID++;
                        DataRow drnew = dsWW.Tables["sfc_pfreportdetail"].NewRow();
                        //细表主键ID  
                        drnew["PFReportDId"] = iChildID;
                        //表头ID
                        drnew["PFReportId"] = iFatherId;
                        //行号
                        drnew["SortSeq"] = (i + 1);
                        //流转卡细表ID
                        drnew["PFDId"] = dsLZK.Tables["sfc_processflowdetail"].DefaultView[i]["PFDId"];
                        //生产订单工艺路线明细ID
                        drnew["MoRoutingDId"] = dsLZK.Tables["sfc_processflowdetail"].DefaultView[i]["MoRoutingDId"];
                        //完成数量
                        drnew["QualifiedQty"] = drv["LZQuantity"];
                        //拒绝数量
                        drnew["RefusedQty"] = 0;
                        //报废数量
                        drnew["ScrapQty"] = 0;
                        //报检数量
                        drnew["DeclareQty"] = 0;
                        //入生产订单工艺路线明细ID
                        //drnew["InMoRoutingDId"] = 0;
                        //
                        drnew["QcType"] = 0;
                        //  从哪里取？
                        drnew["Define22"] = "";
                        //  从哪里取？
                        drnew["Define23"] = "";
                        //流转卡派工ID   
                        drnew["PFShiftId"] = -1;
                        //返工标记 
                        drnew["ReworkFlag"] = 0;
                        //开工日期 
                        drnew["StartTime"] = dsLZK.Tables["sfc_processflowdetail"].DefaultView[i]["StartTime"];
                        //基本用量  从哪里取？
                        drnew["BaseQtyN"] = "0";
                        //
                        dsWW.Tables["sfc_pfreportdetail"].Rows.Add(drnew);
                    }
                }
                //
            }
            #endregion
            #region 生成插入语句
            List<DataTableName> dtnInsertList = new List<DataTableName>();
            foreach (DataTable dt in dsWW.Tables)
            {
                DataRow[] drSelectRows = dt.Select(string.Empty, string.Empty, DataViewRowState.Added);
                if (drSelectRows.Length > 0)
                {
                    string strSQL = "INSERT INTO " + strYongYouDBName + ".DBO." + dt.TableName + " (";
                    string strValue = " SELECT ";
                    foreach (DataColumn dcCol in dt.Columns)
                    {
                        //dcCol.ColumnName.ToLower() == "CWHCODE".ToLower() || 
                        if (dcCol.ColumnName.ToLower() == "Ufts".ToLower() || dcCol.ColumnName.ToLower() == "dUfts".ToLower())
                            continue;
                        if (dcCol.ReadOnly)
                            continue;
                        strSQL += dcCol.ColumnName + ",";
                        strValue += "@" + dcCol.ColumnName + ",";
                    }
                    strSQL = strSQL.Substring(0, strSQL.Length - 1);//去除最后一个逗号
                    strSQL += ")";
                    strValue = strValue.Substring(0, strValue.Length - 1);  //去除最后一个逗号
                    strSQL += strValue;
                    //
                    foreach (DataRow drRow in drSelectRows)
                    {
                        DataTableName dtnInsert = new DataTableName();
                        dtnInsert.strExecSQL = strSQL;
                        foreach (DataColumn dcCol in dt.Columns)
                        {
                            //dcCol.ColumnName.ToLower() == "CWHCODE".ToLower() || 
                            if (dcCol.ColumnName.ToLower() == "Ufts".ToLower() || dcCol.ColumnName.ToLower() == "dUfts".ToLower())
                                continue;
                            if (dcCol.ReadOnly)
                                continue;
                            dtnInsert.SqlExecParameterList.Add(new System.Data.SqlClient.SqlParameter("@" + dcCol.ColumnName, drRow[dcCol.ColumnName, DataRowVersion.Current]));
                        }
                        dtnInsertList.Add(dtnInsert);
                    }
                }
            }
            #endregion
            #region 增加保存后执行语句
            foreach (DataRowView drv in dsInStorage.Tables["T_PartInstorageProduct"].DefaultView)
            {
                string strPFId = drv["PFId"].ToString();
                //
                decimal decLzQuantity = drv["LZQuantity"] == DBNull.Value ? 0 : (decimal)drv["LZQuantity"];
                //刷新流转卡可用加工数量和完成数量
                DataTableName.ExecAfterSQL sql1 = new DataTableName.ExecAfterSQL();
                sql1.strSQL = "update " + strYongYouDBName + ".dbo.sfc_processflowdetail SET BalMachiningQty=( ISNULL(BalMachiningQty,0)-" + decLzQuantity.ToString() + "),CompleteQty=( ISNULL(CompleteQty,0)+" + decLzQuantity.ToString() + ")  WHERE PFId='" + strPFId + "' ";
                dtnInsertList[0].ExecAfterSQLList.Add(sql1);
            }
            dsLZK.Tables["sfc_processflow"].DefaultView.RowFilter = " 1=1 ";
            foreach (DataRowView drv in dsLZK.Tables["sfc_processflow"].DefaultView)
            {
                string strModID = drv["MoDId"].ToString();
                string strPFId = drv["PFId"].ToString();
                //获取流转入库数量
                dsInStorage.Tables["T_PartInstorageProduct"].DefaultView.RowFilter = " PFId='" + strPFId + "'";
                //
                decimal decLzQuantity = 0;
                if (dsInStorage.Tables["T_PartInstorageProduct"].DefaultView.Count > 0)
                    decLzQuantity = dsInStorage.Tables["T_PartInstorageProduct"].DefaultView[0]["LZQuantity"] == DBNull.Value ? 0 : (decimal)dsInStorage.Tables["T_PartInstorageProduct"].DefaultView[0]["LZQuantity"];
                //刷新生产计划工序单可用加工数量和完成数量
                DataTableName.ExecAfterSQL sql1 = new DataTableName.ExecAfterSQL();
                sql1.strSQL = "update " + strYongYouDBName + ".dbo.sfc_moroutingdetail SET BalMachiningQty=( ISNULL(BalMachiningQty,0)-" + decLzQuantity.ToString() + "),CompleteQty=( ISNULL(CompleteQty,0)+" + decLzQuantity.ToString() + ")  WHERE MoDId='" + strModID + "' ";
                dtnInsertList[0].ExecAfterSQLList.Add(sql1);
            }
            //
            DataTableName.ExecAfterSQL sqlMaxID = new DataTableName.ExecAfterSQL();
            sqlMaxID.strSQL = "update " + strYongYouDBName + ".dbo.VoucherHistory SET cNumber='" + dsWW.Tables["VoucherHistory"].DefaultView[0]["Maxnumber"].ToString() + "'  Where CardNumber='FC66' and cContent ='单据日期' and cSeed='" + strcSeed + "'";
            dtnInsertList[0].ExecAfterSQLList.Add(sqlMaxID);
            //
            //DataTableName dtnUpdateID = new DataTableName();
            //dtnUpdateID.strExecSQL = "UPDATE ufsystem.dbo.UA_Identity  SET iFatherId=" + iFatherId.ToString() + ",iChildID=" + iChildID.ToString() + " where cvouchtype='OM_MO' and cacc_id='" + Custom.UI.Common.YongYouAccID + "'";
            //dtnInsertList.Add(dtnUpdateID);
            ////
            //DataTableName dtnUpdateID2 = new DataTableName();
            //dtnUpdateID2.strExecSQL = "UPDATE ufsystem.dbo.UA_Identity  SET iFatherId=" + iChildID.ToString() + ",iChildID=" + iChild2ID.ToString() + " where cvouchtype='OM_Materials' and cacc_id='" + Custom.UI.Common.YongYouAccID + "'";
            //dtnInsertList.Add(dtnUpdateID2);
            sqlMaxID = new DataTableName.ExecAfterSQL();
            int UAIfatherid = 0;
            int UAIiChildID = 0;
            //
            string strUAFatherid = iFatherId.ToString().Substring(1, 9);
            UAIfatherid = Convert.ToInt32(strUAFatherid);
            //
            string strUAiChildID = iChildID.ToString().Substring(1, 9);
            UAIiChildID = Convert.ToInt32(strUAiChildID);

            sqlMaxID.strSQL = "UPDATE ufsystem.dbo.UA_Identity  SET iFatherId=" + UAIfatherid.ToString() + ",iChildID=" + UAIiChildID.ToString() + " where cvouchtype='sfc_pfreport' and cacc_id='" + strZT + "'";
            dtnInsertList[0].ExecAfterSQLList.Add(sqlMaxID);
            sqlMaxID = new DataTableName.ExecAfterSQL();
            sqlMaxID.strSQL = "UPDATE ufsystem.dbo.UA_Identity  SET iFatherId=" + UAIfatherid.ToString() + ",iChildID=" + UAIiChildID.ToString() + " where cvouchtype='sfc_pfreportdetail' and cacc_id='" + strZT + "'";
            dtnInsertList[0].ExecAfterSQLList.Add(sqlMaxID);
            #endregion
            try
            {
                CustomizableDesignBLL.ExecSQL(dtnInsertList);
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return "";
        }

        #endregion

        #region 材料出库单API
        public string MaterialOutStorage(DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strPKValue)
        {
            //inventory 存货档案表  是否批次管理 bInvBatch
            //Warehouse 仓库档案    代管仓   bProxyWh 
            string strResult = string.Empty;
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_997_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                return "登陆失败，原因：" + u8Login.ShareString;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/MaterialOut/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/MaterialOut/Add");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：11
            broker.AssignNormalValue("sVouchType", "11");

            //给BO表头参数DomHead赋值，此BO参数的业务类型为材料出库单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())


            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            DomHead[0]["ccode"] = "2018010604007"; //出库单号，string类型
            DomHead[0]["ddate"] = dtCreateDate.ToString("yyyy-MM-dd"); //出库日期，DateTime类型
            string strStorageName = ds.Tables[0].DefaultView[0]["cwhname"].ToString();
            string strcwhcode = "";
            string strcwhname = "";
            int iStartIndex = strStorageName.IndexOf('(');
            int iEndIndex = strStorageName.IndexOf(')');
            if (iStartIndex >= 0 && iEndIndex > 0 && iEndIndex > iStartIndex)
            {
                strcwhcode = strStorageName.Substring(iStartIndex + 1, iEndIndex - iStartIndex - 1);
                strcwhname = strStorageName.Substring(iEndIndex + 1, strStorageName.Length - iEndIndex - 1);
            }

            DomHead[0]["cwhname"] = strcwhname; //仓库，string类型
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型
            DomHead[0]["bmotran"] = "0"; //自动编号，string类型
            //DomHead[0]["isourcerowno"] = ""; //来源单行号，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            //DomHead[0]["hcinvdefine1"] = ""; //存货自定义项1，string类型
            //DomHead[0]["hcinvdefine2"] = ""; //存货自定义项2，string类型
            //DomHead[0]["hcinvdefine3"] = ""; //存货自定义项3，string类型
            //DomHead[0]["hcinvdefine4"] = ""; //存货自定义项3，string类型
            //DomHead[0]["hcinvdefine5"] = ""; //存货自定义项5，string类型
            //DomHead[0]["hcinvdefine6"] = ""; //存货自定义项3，string类型
            //DomHead[0]["hcinvdefine7"] = ""; //存货自定义项7，string类型
            //DomHead[0]["hcinvdefine8"] = ""; //存货自定义项8，string类型
            //DomHead[0]["hcinvdefine9"] = ""; //存货自定义项9，string类型
            //DomHead[0]["hcinvdefine10"] = ""; //存货自定义项10，string类型
            //DomHead[0]["hcinvdefine11"] = ""; //存货自定义项11，int类型
            //DomHead[0]["hcinvdefine12"] = ""; //存货自定义项12，int类型
            //DomHead[0]["hcinvdefine13"] = ""; //存货自定义项13，double类型
            //DomHead[0]["hcinvdefine14"] = ""; //存货自定义项14，double类型
            //DomHead[0]["hcinvdefine15"] = ""; //存货自定义项15，DateTime类型
            //DomHead[0]["hcinvdefine16"] = ""; //存货自定义项16，DateTime类型
            //DomHead[0]["cinvstd"] = ""; //规格型号，string类型
            //DomHead[0]["dchkdate"] = ""; //检验日期，DateTime类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["iproorderid"] = ""; //生产订单ID，string类型
            //DomHead[0]["cmpocode"] = ""; //订单号，string类型
            //DomHead[0]["cpspcode"] = ""; //产品编码，string类型
            //DomHead[0]["cproinvaddcode"] = ""; //存货代码，string类型
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            DomHead[0]["iverifystate"] = "0"; //iverifystate，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，string类型
            //DomHead[0]["imquantity"] = ""; //产量，double类型
            //DomHead[0]["cprobatch"] = ""; //生产批号，string类型
            DomHead[0]["cbustype"] = "领料"; //业务类型，int类型
            //DomHead[0]["cbuscode"] = ""; //业务号，string类型
            //DomHead[0]["cchkperson"] = ""; //检验员，string类型
            //DomHead[0]["crdname"] = ""; //出库类别，string类型
            //DomHead[0]["cdepname"] = ""; //部门，string类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["cvenabbname"] = ""; //委外商，string类型
            DomHead[0]["bomfirst"] = "0"; //bomfirst，string类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型
            //DomHead[0]["dveridate"] = ""; //审核日期，DateTime类型
            DomHead[0]["crdcode"] = "202"; //出库类别编码，string类型
            DomHead[0]["cmemo"] = "cqztest"; //备注，string类型
            DomHead[0]["cmaker"] = "用友实施"; //制单人，string类型
            //DomHead[0]["chandler"] = ""; //审核人，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["cinvname"] = ""; //产品名称，string类型
            DomHead[0]["biscomplement"] = "0"; //补料标志，int类型
            //DomHead[0]["cpersonname"] = ""; //业务员，string类型
            //DomHead[0]["bpositive"] = ""; //红蓝标识，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            DomHead[0]["csource"] = "库存"; //单据来源，int类型
            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["brdflag"] = ""; //收发标志，string类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            //DomHead[0]["cvencode"] = ""; //委外商编码，string类型
            //中间数据库表的主键
            DomHead[0]["cdefine10"] = strPKValue; //表头自定义项10，string类型
            DomHead[0]["cvouchtype"] = "11"; //单据类型，string类型


            DomHead[0]["cwhcode"] = strcwhcode; //仓库编码，string类型
            DomHead[0]["cdepcode"] = "1022"; //部门编码，string类型
            //DomHead[0]["cpersoncode"] = ""; //业务员编码，string类型
            DomHead[0]["vt_id"] = "131486"; //模版号，int类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型

            //给BO表体参数domBody赋值，此BO参数的业务类型为材料出库单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = ds.Tables["T_PartOutStorageProduct"].DefaultView.Count; //设置BO对象行数
            #region 细表数据
            for (int iRow = 0; iRow < ds.Tables["T_PartOutStorageProduct"].DefaultView.Count; iRow++)
            {
                //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
                //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
                //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = "0"; //主关键字段，int类型


                domBody[iRow]["cinvcode"] = ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["ProductCode"].ToString(); //材料编码，string类型



                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["iavaquantity"] = ""; //可用量，string类型
                //domBody[iRow]["iavanum"] = ""; //可用件数，string类型
                //domBody[iRow]["ipresent"] = ""; //现存量，string类型
                //domBody[iRow]["iinvsncount"] = ""; //序列号个数，string类型
                //domBody[iRow]["imaids"] = ""; //领料申请单子表id，string类型
                //domBody[iRow]["csourcemocode"] = ""; //源订单号，string类型
                //domBody[iRow]["isourcemodetailsid"] = ""; //源订单子表标识，string类型
                //domBody[iRow]["invstd"] = ""; //产品规格，string类型
                domBody[iRow]["cbmemo"] = "PDA生成"; //备注，string类型
                //domBody[iRow]["applycode"] = ""; //子件补料申请单号，string类型
                //domBody[iRow]["applydid"] = ""; //applydid，string类型
                domBody[iRow]["irowno"] = iRow + 1; //行号，string类型
                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["cservicecode"] = ""; //服务单号，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["coutvouchid"] = ""; //对应蓝字出库单id，string类型
                //domBody[iRow]["coutvouchtype"] = ""; //对应蓝字出库单类型，string类型
                //domBody[iRow]["isredoutquantity"] = ""; //对应蓝字出库单退回数量，string类型
                //domBody[iRow]["isredoutnum"] = ""; //对应蓝字出库单退回件数，string类型
                domBody[iRow]["ipesotype"] = "0"; //需求跟踪方式，string类型
                //domBody[iRow]["ipesodid"] = ""; //销售订单子表，string类型
                //domBody[iRow]["cpesocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["ipesoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["bsupersede"] = ""; //替代料，string类型
                //domBody[iRow]["isupersedeqty"] = ""; //替代数量，string类型
                //domBody[iRow]["isupersedempoids"] = ""; //被替代料生产订单子表id，string类型
                //domBody[iRow]["imoallocatesubid"] = ""; //替代料子表subid，string类型
                //domBody[iRow]["cinvoucherlineid"] = ""; //源单行ID，string类型
                //domBody[iRow]["cinvouchercode"] = ""; //源单号，string类型
                //domBody[iRow]["cinvouchertype"] = ""; //源单类型，string类型
                //domBody[iRow]["ipresentnum"] = ""; //现存件数，string类型
                //domBody[iRow]["cplanlotcode"] = ""; //计划批号，string类型
                //domBody[iRow]["bcanreplace"] = ""; //可替代，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型

                /***************************** 以下是非必输字段 ****************************/
                //domBody[iRow]["id"] = "1000311417"; //与主表关联项，int类型

                //domBody[iRow]["cinvaddcode"] = ""; //材料代码，string类型
                //domBody[iRow]["cinvname"] = ""; //材料名称，string类型
                //domBody[iRow]["cinvstd"] = ""; //规格型号，string类型

                domBody[iRow]["cinvm_unit"] = "只"; //inventory.cComUnitCode 主计量单位，string类型



                domBody[iRow]["cinva_unit"] = ""; //inventory.cSTComUnitCode 库存单位，string类型
                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型
                domBody[iRow]["cposition"] = ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["PostCode"].ToString(); //货位编码，string类型
                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，double类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，double类型
                //domBody[iRow]["cfree2"] = ""; //存货自由项2，string类型

                bool bInvBatch = ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["bInvBatch"] == DBNull.Value ? false : (bool)ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["bInvBatch"];
                if (bInvBatch)
                    domBody[iRow]["cbatch"] = ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["PiHao"].ToString(); //批号，string类型  sqg 必需项
                else
                    domBody[iRow]["cbatch"] = "";
                domBody[iRow]["iinvexchrate"] = "0"; //换算率，double类型
                //domBody[iRow]["inum"] = "0"; //件数，double类型



                decimal decQuantity = ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["Quantity"] == DBNull.Value ? 0 : (decimal)ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["Quantity"];
                domBody[iRow]["iquantity"] = Trade.DBUtility.Common.decimalEx.RoundEx(decQuantity, 2);  //数量，double类型
                //domBody[iRow]["iunitcost"] = ""; //单价，double类型
                //domBody[iRow]["iprice"] = ""; //金额，double类型
                //domBody[iRow]["ipunitcost"] = ""; //计划单价，double类型
                //domBody[iRow]["ipprice"] = ""; //计划金额，double类型
                //domBody[iRow]["dvdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["cobjcode"] = ""; //成本对象编码，string类型
                //domBody[iRow]["cname"] = ""; //项目，string类型
                //domBody[iRow]["isoutquantity"] = ""; //累计出库数量，double类型
                //domBody[iRow]["isoutnum"] = ""; //累计出库件数，double类型
                //domBody[iRow]["dsdate"] = ""; //结算日期，DateTime类型
                //domBody[iRow]["ifquantity"] = ""; //实际数量，double类型
                //domBody[iRow]["ifnum"] = ""; //实际件数，double类型
                //domBody[iRow]["cvouchcode"] = ""; //对应入库单id，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，double类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，double类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，double类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cbatchproperty8"] = ""; //批次属性8，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，DateTime类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型
                //domBody[iRow]["inquantity"] = ""; //应发数量，double类型
                //domBody[iRow]["innum"] = ""; //应发件数，double类型
                //domBody[iRow]["dmadedate"] = ""; //生产日期，DateTime类型
                //domBody[iRow]["impoids"] = ""; //生产订单子表ID，int类型
                //domBody[iRow]["isodid"] = ""; //销售订单子表ID，string类型
                //domBody[iRow]["iomomid"] = ""; //委外用料表ID，int类型
                //domBody[iRow]["iomodid"] = ""; //委外订单子表ID，int类型
                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //domBody[iRow]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                //domBody[iRow]["cposname"] = ""; //货位，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["cmolotcode"] = ""; //生产批号，string类型
                //domBody[iRow]["dmsdate"] = ""; //核销日期，DateTime类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["cmocode"] = ""; //生产订单号，string类型
                //domBody[iRow]["comcode"] = ""; //委外订单号，string类型

                bool bProxyWh = ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["bProxyWh"] == DBNull.Value ? false : (bool)ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["bProxyWh"];
                if (bProxyWh)
                    domBody[iRow]["cvmivencode"] = ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["cvmivencode"].ToString(); //代管商代码，string类型 sqg  必需项
                else
                    domBody[iRow]["cvmivencode"] = "";
                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型
                //domBody[iRow]["bvmiused"] = ""; //代管消耗标识，int类型
                //domBody[iRow]["ivmisettlequantity"] = ""; //代管挂账确认单数量，double类型
                //domBody[iRow]["ivmisettlenum"] = ""; //代管挂账确认单件数，double类型ssssssssss
                //domBody[iRow]["productinids"] = ""; //productinids，int类型
                //domBody[iRow]["crejectcode"] = ""; //在库不良品处理单号，string类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型
                //domBody[iRow]["iordertype"] = ""; //销售订单类别，int类型
                //domBody[iRow]["iorderdid"] = ""; //iorderdid，int类型
                //domBody[iRow]["iordercode"] = ""; //销售订单号，string类型
                //domBody[iRow]["iorderseq"] = ""; //销售订单行号，string类型
                domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，string类型
                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["ibondedsumqty"] = ""; //累计保税处理抽取数量，string类型
                //domBody[iRow]["copdesc"] = ""; //工序说明，string类型
                //domBody[iRow]["cmworkcentercode"] = ""; //工作中心编码，string类型
                //domBody[iRow]["cmworkcenter"] = ""; //工作中心，string类型
                //domBody[iRow]["invcode"] = ""; //产品编码，string类型
                //domBody[iRow]["invname"] = ""; //产品，string类型
                //domBody[iRow]["cwhpersonname"] = ""; //库管员名称，string类型
                //domBody[iRow]["cbaccounter"] = ""; //记账人，string类型
                //domBody[iRow]["bcosting"] = ""; //是否核算，string类型
                //domBody[iRow]["isotype"] = ""; //需求跟踪方式，int类型
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["imoseq"] = ""; //生产订单行号，string类型
                //domBody[iRow]["iopseq"] = ""; //工序行号，string类型
                //domBody[iRow]["isquantity"] = ""; //累计核销数量，double类型
                //domBody[iRow]["ismaterialfee"] = ""; //累计核销金额，double类型
                domBody[iRow]["cdefine34"] = ds.Tables["T_PartOutStorageProduct"].DefaultView[iRow]["SerialID"].ToString(); //表体自定义项3，string类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["cwhpersoncode"] = ""; //库管员编码，string类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["itrids"] = ""; //特殊单据子表标识，double类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //表体自定义项6，double类型
                //domBody[iRow]["citemcode"] = ""; //项目编码，string类型
                //domBody[iRow]["citem_class"] = ""; //项目大类编码，string类型
                //domBody[iRow]["citemcname"] = ""; //项目大类名称，string类型
            }
            #endregion
            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        //结束本次调用，释放API资源
                        broker.Release();
                        return "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        //结束本次调用，释放API资源
                        broker.Release();
                        return "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    //结束本次调用，释放API资源
                    broker.Release();
                    if (exReason.Length != 0)
                    {
                        return "异常原因：" + exReason;
                    }
                }
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return "失败！" + errMsgRet;
            }
            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return strResult;
        }
        #endregion
        #region 材料出库单审核
        public string AuditOutStorage(string strYongYouDBName, DataSet ds, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {
            string strCKNum = string.Empty;
            //
            if (ds.Tables[0].DefaultView.Count == 0 || ds.Tables["T_MaterialCKProduct"].DefaultView.Count == 0)
            {
                return "API接口传入的材料出库数据错误，数据行数为0!";
            }
            //
            strCKNum = ds.Tables[0].DefaultView[0]["CKNum"].ToString();
            if (string.IsNullOrEmpty(strCKNum))
            {
                return "材料出库单号为空，无法审核!";
            }
            //
            #region 获取材料出库单的数据
            DataSet dsCKAndPC = new DataSet();
            //审核
            List<DataTableName> DataTableNameverList = new List<DataTableName>();
            DataTableName DataTableNamever = new DataTableName();
            DataTableNamever.strSelectSQL = "select *,convert(nchar,convert(money,ufts),2) as ufts1 from " + strYongYouDBName + ".dbo.rdrecord11  where ccode ='" + strCKNum + "'";
            DataTableNamever.strTableName = "rdrecord11";
            DataTableNameverList.Add(DataTableNamever);
            //
            DataTableNamever = new DataTableName();
            DataTableNamever.strSelectSQL = "select * from " + strYongYouDBName + ".dbo.RdRecords11 where id in ( select id from " + strYongYouDBName + ".dbo.rdrecord11  where ccode ='" + strCKNum + "')";
            DataTableNamever.strTableName = "RdRecords11";
            DataTableNameverList.Add(DataTableNamever);
            //
            DataTableNamever = new DataTableName();
            DataTableNamever.strSelectSQL = "select * from " + strYongYouDBName + ".dbo.Inventory where cInvCode in (select cInvCode from " + strYongYouDBName + ".dbo.RdRecords11 where id in ( select id from " + strYongYouDBName + ".dbo.rdrecord11  where ccode ='" + strCKNum + "'))";
            DataTableNamever.strTableName = "Inventory";
            DataTableNameverList.Add(DataTableNamever);
            try
            {
                dsCKAndPC = CustomizableDesignBLL.GetData(DataTableNameverList, false);
            }
            catch (Exception ex)
            {
                return "取U8材料出库数据出错：" + ex.Message;
            }
            #endregion
            //
            #region 创建一个根据批次，存货编码，货位，汇总数量的表
            DataTable dtRealQty = new DataTable();
            dtRealQty.Columns.Add(new DataColumn("SerialID", typeof(int)));
            dtRealQty.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("cPosCode", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("SHBacthNo", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("Quantity", typeof(decimal)));
            #endregion
            #region 汇总扫描明细表
            int iSerialID = 1;
            for (int i = 0; i < ds.Tables["T_MaterialCKProduct"].DefaultView.Count; i++)
            {
                string strcInvCode = ds.Tables["T_MaterialCKProduct"].DefaultView[i]["ProductCode"].ToString();
                string strSHBacthNo = ds.Tables["T_MaterialCKProduct"].DefaultView[i]["BatchNo"].ToString();
                string strcPosition = ds.Tables["T_MaterialCKProduct"].DefaultView[i]["goodAddress"].ToString();

                string strcPosiCode = GetwhOrPoCodeAndName(strcPosition, 0);

                //数量
                decimal decBarCount = 0;
                //
                if (ds.Tables["T_MaterialCKProduct"].DefaultView[i]["Quantity"] != DBNull.Value)
                {
                    decBarCount = Convert.ToDecimal(ds.Tables["T_MaterialCKProduct"].DefaultView[i]["Quantity"].ToString());
                }
                //

                dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and isnull(cPosCode,'') ='" + strcPosiCode + "' and  isnull(SHBacthNo,'') ='" + strSHBacthNo + "'  ";
                if (dtRealQty.DefaultView.Count > 0)
                {
                    decimal decBaseQty = Convert.ToDecimal(dtRealQty.DefaultView[0]["Quantity"].ToString());
                    //
                    dtRealQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                    dtRealQty.DefaultView[0].EndEdit();
                }
                else
                {
                    DataRow drNew = dtRealQty.NewRow();
                    drNew["SerialID"] = iSerialID;
                    drNew["cInvCode"] = strcInvCode;
                    drNew["cPosCode"] = strcPosiCode;
                    drNew["SHBacthNo"] = strSHBacthNo;
                    drNew["Quantity"] = decBarCount;
                    dtRealQty.Rows.Add(drNew);
                    iSerialID++;
                }
                //
            }
            dtRealQty.DefaultView.RowFilter = "";
            #endregion
            #region 判断是否扫的存货批次货位不是其他出库单的
            foreach (DataRowView drv in dtRealQty.DefaultView)
            {
                string strcBatch = drv["SHBacthNo"].ToString();
                string strcInvCode = drv["cInvCode"].ToString();
                string strcPosition = drv["cPosCode"].ToString();
                //
                DataRow[] drU8Select = dsCKAndPC.Tables["RdRecords11"].Select("cInvCode='" + strcInvCode + "' and isnull(cPosition,'')='" + strcPosition + "' and isnull(cBatch,'') ='" + strcBatch + "'  ");
                //
                if (drU8Select.Length == 0)
                {
                    return "存货" + strcInvCode + "批次" + strcBatch + "货位" + strcPosition + "的不是当前出库单需要出库的，不能审核";
                }
            }
            #endregion
            #region 创建一个根据批次，存货编码，货位，汇总数量的表
            DataTable dtU8OutQty = new DataTable();
            dtU8OutQty.Columns.Add(new DataColumn("SerialID", typeof(int)));
            dtU8OutQty.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dtU8OutQty.Columns.Add(new DataColumn("cPosCode", typeof(string)));
            dtU8OutQty.Columns.Add(new DataColumn("SHBacthNo", typeof(string)));
            dtU8OutQty.Columns.Add(new DataColumn("Quantity", typeof(decimal)));
            #endregion
            #region 汇总其他出库表
            int iSerialIDU8 = 1;
            for (int i = 0; i < dsCKAndPC.Tables["RdRecords11"].DefaultView.Count; i++)
            {
                string strcInvCode = dsCKAndPC.Tables["RdRecords11"].DefaultView[i]["cInvCode"].ToString();
                string strSHBacthNo = dsCKAndPC.Tables["RdRecords11"].DefaultView[i]["cBatch"].ToString();
                string strcPosition = dsCKAndPC.Tables["RdRecords11"].DefaultView[i]["cPosition"].ToString();

                //数量
                decimal decBarCount = 0;
                //
                if (dsCKAndPC.Tables["RdRecords11"].DefaultView[i]["iQuantity"] != DBNull.Value)
                {
                    decBarCount = Convert.ToDecimal(dsCKAndPC.Tables["RdRecords11"].DefaultView[i]["iQuantity"].ToString());
                }
                //

                dtU8OutQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and  isnull(cPosCode,'')='" + strcPosition + "' and isnull(SHBacthNo,'') ='" + strSHBacthNo + "'  ";
                if (dtU8OutQty.DefaultView.Count > 0)
                {
                    decimal decBaseQty = Convert.ToDecimal(dtU8OutQty.DefaultView[0]["Quantity"].ToString());
                    //
                    dtU8OutQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                    dtU8OutQty.DefaultView[0].EndEdit();
                }
                else
                {
                    DataRow drNew = dtU8OutQty.NewRow();
                    drNew["SerialID"] = iSerialID;
                    drNew["cInvCode"] = strcInvCode;
                    drNew["cPosCode"] = strcPosition;
                    drNew["SHBacthNo"] = strSHBacthNo;
                    drNew["Quantity"] = decBarCount;
                    dtU8OutQty.Rows.Add(drNew);
                    iSerialIDU8++;
                }
                //
            }
            dtU8OutQty.DefaultView.RowFilter = "";
            #endregion
            #region 判断对应的批次货位数量是否超出，同时刷新cDefine34
            List<DataTableName> dtnExecList = new List<DataTableName>();
            dtU8OutQty.DefaultView.RowFilter = "";
            foreach (DataRowView drv in dtU8OutQty.DefaultView)
            {
                string strcBatch = drv["SHBacthNo"].ToString();
                string strcInvCode = drv["cInvCode"].ToString();
                string strcPosition = drv["cPosCode"].ToString();
                //
                decimal decU8OutQty = drv["Quantity"] == DBNull.Value ? 0 : (decimal)drv["Quantity"];

                dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and isnull(cPosCode,'') ='" + strcPosition + "' and isnull(SHBacthNo,'') ='" + strcBatch + "'  ";
                //
                if (dtRealQty.DefaultView.Count == 0)
                {
                    continue;
                }
                //扫描数量
                decimal decScanQty = 0;
                foreach (DataRowView drvScan in dtRealQty.DefaultView)
                {
                    decimal decItem = drvScan["Quantity"] == DBNull.Value ? 0 : (decimal)drvScan["Quantity"];
                    decScanQty = decScanQty + decItem;
                }
                string bredvouch = dsCKAndPC.Tables["rdrecord11"].DefaultView[0]["bredvouch"].ToString();
                if (bredvouch != "0")
                {
                    //如果红字，必须相等
                    if (decU8OutQty != decScanQty)
                    {
                        return "存货" + strcInvCode + "批次" + strcBatch + "货位" + strcPosition + "的出库数量" + decU8OutQty.ToString("###,###,##0.00###") + "，当前扫描数量" + decScanQty.ToString("###,###,##0.00###") + "，红单必须相等";
                    }
                }
                else
                {
                    //如果蓝字，相等或者大于（大于要根据自定义项2来判断）
                    if (decU8OutQty > decScanQty)
                    {
                        return "存货" + strcInvCode + "批次" + strcBatch + "货位" + strcPosition + "的出库数量" + decU8OutQty.ToString("###,###,##0.00###") + "，当前扫描数量" + decScanQty.ToString("###,###,##0.00###") + "，小于出库数量，请检查";
                    }
                    //如果蓝字，要根据存货自定义项2，判断是否允许超出
                    if (decU8OutQty < decScanQty)
                    {
                        //自定义项2=是，允许大于出库数量
                        DataRow[] drInventorySelectRows = dsCKAndPC.Tables["Inventory"].Select(" cInvCode='" + strcInvCode + "'");
                        if (drInventorySelectRows.Length == 0)
                        {
                            return "存货档案" + strcInvCode + "不存在";
                        }
                        if (drInventorySelectRows[0]["cInvDefine2"].ToString() != "是")
                        {
                            return "存货" + strcInvCode + "批次" + strcBatch + "货位" + strcPosition + "的出库数量" + decU8OutQty.ToString("###,###,##0.00###") + "，当前扫描数量" + decScanQty.ToString("###,###,##0.00###") + "，请检查";
                        }
                    }
                }
                //根据批次 货位 存货编码,刷cDefine34
                DataTableName dtnExec = new DataTableName();
                dtnExec.strExecSQL = "UPDATE " + strYongYouDBName + ".dbo.RdRecords11 set cDefine34=" + ds.Tables[0].DefaultView[0]["ID"].ToString() + " where ISNULL(cInvCode,'')='" + strcInvCode + "' and ISNULL(cPosition,'')='" + strcPosition + "' and ISNULL(cBatch,'')='" + strcBatch + "' and id in ( select id from " + strYongYouDBName + ".dbo.rdrecord11  where ccode ='" + strCKNum + "')";
                dtnExecList.Add(dtnExec);
            }
            //更新SQL
            try
            {
                if (dtnExecList.Count > 0)
                    CustomizableDesignBLL.ExecSQL(dtnExecList);
            }
            catch (Exception ex)
            {
                return "更新材料出库的cDefine34出错：" + ex.Message;
            }
            #endregion
            //获取材料出库单的ID
            int iMaterialID = Convert.ToInt32(dsCKAndPC.Tables[0].DefaultView[0]["ID"]);
            #region 判断cDefine34字段，是否全部有值了,以及生成需要货位调整单的数据，为什么放在这里，是想在出库审核前再判断一下
            List<DataTableName> dtnNeedAdjustList = new List<DataTableName>();
            //
            DataTableName dtn = new DataTableName();
            dtn.strSelectSQL = "select * from " + strYongYouDBName + ".dbo.RdRecords11 where ISNULL(cDefine34,0)=0 and id in ( select id from " + strYongYouDBName + ".dbo.rdrecord11  where ccode ='" + strCKNum + "')";
            dtn.strTableName = "RdRecords11";
            dtnNeedAdjustList.Add(dtn);
            //
            dtn = new DataTableName();
            dtn.strSelectSQL = "select cInvCode,ISNULL(cPosition,'') cPosition,isnull(cBatch,'') cBatch,SUM(iQuantity) iQuantity \r\n" +
                                "from " + strYongYouDBName + ".dbo.RdRecords11 \r\n" +
                                "where id in ( select id from " + strYongYouDBName + ".dbo.rdrecord11 \r\n" +
                               "                where ccode ='" + strCKNum + "') \r\n" +
                               " GROUP BY cInvCode,ISNULL(cPosition,''),isnull(cBatch,'')";
            dtn.strTableName = "Group_RdRecords11";
            dtnNeedAdjustList.Add(dtn);
            //
            dtn = new DataTableName();
            dtn.strSelectSQL = "SELECT T_MaterialCKProduct.ProductCode,ISNULL(T_MaterialCKProduct.goodAddress,'') goodAddress,ISNULL(T_MaterialCKProduct.BatchNo,'') BatchNo,SUM(T_MaterialCKProduct.Quantity) Quantity \r\n" +
                                "FROM T_MaterialCK \r\n" +
                                "INNER join T_MaterialCKProduct ON T_MaterialCK.serialnum=T_MaterialCKproduct.serialnum \r\n" +
                                "WHERE T_MaterialCK.id IN (select cDefine34 \r\n" +
                                                            "from " + strYongYouDBName + ".dbo.RdRecords11 \r\n" +
                                                            "where id in ( select id from " + strYongYouDBName + ".dbo.rdrecord11  where ccode ='" + strCKNum + "')) \r\n" +
                                 " GROUP BY  T_MaterialCKProduct.ProductCode,ISNULL(T_MaterialCKProduct.goodAddress,''),ISNULL(T_MaterialCKProduct.BatchNo,'')";
            dtn.strTableName = "T_Group_MaterialCKProduct";
            dtnNeedAdjustList.Add(dtn);
            //
            dtn = new DataTableName();
            dtn.strSelectSQL = "SELECT T_MaterialCKProduct.*,'' NeedModify \r\n" +
                                "FROM T_MaterialCK \r\n" +
                                "INNER join T_MaterialCKProduct ON T_MaterialCK.serialnum=T_MaterialCKproduct.serialnum \r\n" +
                                "WHERE T_MaterialCK.id IN (select cDefine34 \r\n" +
                                                            "from " + strYongYouDBName + ".dbo.RdRecords11 \r\n" +
                                                            "where id in ( select id from " + strYongYouDBName + ".dbo.rdrecord11  where ccode ='" + strCKNum + "'))";
            dtn.strTableName = "T_MaterialCKProduct";
            dtnNeedAdjustList.Add(dtn);
            //
            DataSet dsNeedAdjust = new DataSet();
            try
            {
                dsNeedAdjust = CustomizableDesignBLL.GetData(dtnNeedAdjustList, false);
            }
            catch (Exception ex)
            {
                return "取U8材料出库数据出错：" + ex.Message;
            }
            bool bISAll = dsNeedAdjust.Tables["RdRecords11"].DefaultView.Count == 0;
            if (!bISAll)
            {
                return "";
            }
            //先处理货位
            foreach (DataRowView drv in dsNeedAdjust.Tables["T_Group_MaterialCKProduct"].DefaultView)
            {
                drv["goodAddress"] = GetwhOrPoCodeAndName(drv["goodAddress"].ToString(), 0);
                drv.EndEdit();
            }
            foreach (DataRowView drv in dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView)
            {
                drv["goodAddress"] = GetwhOrPoCodeAndName(drv["goodAddress"].ToString(), 0);
                drv.EndEdit();
            }
            //多出来的数量，从最后一行开始递减
            foreach (DataRowView drv in dsNeedAdjust.Tables["T_Group_MaterialCKProduct"].DefaultView)
            {
                string strProductCode = drv["ProductCode"].ToString();
                string strgoodAddress = drv["goodAddress"].ToString();
                string strBatchNo = drv["BatchNo"].ToString();
                decimal decQuantity = drv["Quantity"] == DBNull.Value ? 0 : Convert.ToDecimal(drv["Quantity"].ToString());
                //
                object objU8Quantity = dsNeedAdjust.Tables["Group_RdRecords11"].Compute("Sum(iQuantity)", "isnull(cInvCode,'')='" + strProductCode + "' and isnull(cPosition,'')='" + strgoodAddress + "' and isnull(cBatch,'')='" + strBatchNo + "'");
                decimal decU8Quantity = objU8Quantity == null || objU8Quantity == DBNull.Value ? 0 : Convert.ToDecimal(objU8Quantity.ToString());
                if (decQuantity > decU8Quantity)
                {
                    DataRow[] drMaterialCKSelectRows = dsNeedAdjust.Tables["T_MaterialCKProduct"].Select("isnull(ProductCode,'')='" + strProductCode + "' and isnull(goodAddress,'')='" + strgoodAddress + "' and isnull(BatchNo,'')='" + strBatchNo + "'", "SerialNum desc,SortID desc");
                    decimal decSaveQuantity = decQuantity - decU8Quantity;
                    for (int i = 0; i < drMaterialCKSelectRows.Length; i++)
                    {
                        drMaterialCKSelectRows[i]["NeedModify"] = "是";
                        decimal dec = drMaterialCKSelectRows[i]["Quantity"] == DBNull.Value ? 0 : Convert.ToDecimal(drMaterialCKSelectRows[i]["Quantity"].ToString());
                        if (decSaveQuantity > dec)
                        {
                            drMaterialCKSelectRows[i]["Quantity"] = 0;//这种等于0的情况应该不存在的
                            drMaterialCKSelectRows[i].EndEdit();
                            //递减
                            decSaveQuantity = decSaveQuantity - dec;
                        }
                        else
                        {
                            //多出来的数量，回刷
                            drMaterialCKSelectRows[i]["Quantity"] = decSaveQuantity;
                            drMaterialCKSelectRows[i].EndEdit();
                            break;
                        }
                    }
                }
            }
            #endregion
            //
            #region U8材料出库单出库单审核
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSerial = "";
            string sSubId = "AS";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }
            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/MaterialOut/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/MaterialOut/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值
            int ID = iMaterialID;

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：11
            broker.AssignNormalValue("sVouchType", "11");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", ID.ToString());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", dsCKAndPC.Tables[0].DefaultView[0]["ufts1"]);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            //给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            //给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            //给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());


            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());

            //获取普通返回值。此返回值数据类型为System.String，此参数按值传递，表示成功返回空串
            System.String resultMsg = broker.GetResult("errMsg") as System.String;
            if (result == false)
            {
                //结束本次调用，释放API资源
                broker.Release();
                return resultMsg;
            }
            //结束本次调用，释放API资源
            broker.Release();
            #endregion
            if (dsNeedAdjust.Tables["T_MaterialCKProduct"].Select("isnull(NeedModify,'')='是'").Length > 0)
            {
                #region 生成仓位调整单
                DataSet dsAdjustPVouch = new DataSet();
                List<DataTableName> dtnAdjustPVouchList = new List<DataTableName>();
                DataTableName dtnAdjustPVouch = new DataTableName();
                dtnAdjustPVouch.strSelectSQL = "select * from T_AdjustPVouch where 1=2";
                dtnAdjustPVouch.strTableName = "T_AdjustPVouch";
                dtnAdjustPVouchList.Add(dtnAdjustPVouch);
                //
                dtnAdjustPVouch = new DataTableName();
                dtnAdjustPVouch.strSelectSQL = "select * from T_AdjustPVouchProduct where 1=2";
                dtnAdjustPVouch.strTableName = "T_AdjustPVouchProduct";
                dtnAdjustPVouchList.Add(dtnAdjustPVouch);
                try
                {
                    dsAdjustPVouch = CustomizableDesignBLL.GetData(dtnAdjustPVouchList, true);
                }
                catch (Exception ex)
                {
                    return "获取货位调整的表结构出错：" + ex.Message;
                }
                DataRow drAdjustNew = dsAdjustPVouch.Tables["T_AdjustPVouch"].NewRow();
                //判断有无重复写入，所以加了CK的前缀
                drAdjustNew["SerialNum"] = "CK" + ds.Tables["T_MaterialCK"].DefaultView[0]["SerialNum"].ToString();
                drAdjustNew["ISDel"] = 0;
                drAdjustNew["CreatDate"] = ds.Tables["T_MaterialCK"].DefaultView[0]["CreatDate"];
                drAdjustNew["StorageName"] = ds.Tables["T_MaterialCK"].DefaultView[0]["cWhName"];
                drAdjustNew["Creater"] = ds.Tables["T_MaterialCK"].DefaultView[0]["Creater"];
                drAdjustNew["CreaterName"] = ds.Tables["T_MaterialCK"].DefaultView[0]["CreaterName"];
                drAdjustNew["UserCode"] = "";
                drAdjustNew["CNUserName"] = "";
                drAdjustNew["SaveTime"] = ds.Tables["T_MaterialCK"].DefaultView[0]["SaveTime"];
                drAdjustNew["Remark"] = "";
                drAdjustNew["CKNum"] = strCKNum;
                dsAdjustPVouch.Tables["T_AdjustPVouch"].Rows.Add(drAdjustNew);
                int iSortID = -1;
                for (int i = 0; i < dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView.Count; i++)
                {
                    if (dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["NeedModify"].ToString() != "是")
                        continue;
                    drAdjustNew = dsAdjustPVouch.Tables["T_AdjustPVouchProduct"].NewRow();
                    drAdjustNew["SerialNum"] = dsAdjustPVouch.Tables["T_AdjustPVouch"].DefaultView[0]["SerialNum"].ToString();
                    drAdjustNew["ISDel"] = 0;
                    iSortID++;
                    drAdjustNew["SortID"] = iSortID;
                    drAdjustNew["GUID"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["GUID"].ToString();
                    drAdjustNew["BarCode"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["BarCode"];
                    drAdjustNew["cInvName"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["CNProductName"];
                    drAdjustNew["cPackingType"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["Model"];
                    drAdjustNew["BarCount"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["Quantity"];
                    drAdjustNew["cBatch"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["BatchNo"];
                    drAdjustNew["cInvCode"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["ProductCode"];
                    drAdjustNew["Num"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["FQuantity"];
                    drAdjustNew["SendUnit"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["FQtyUnit"];
                    drAdjustNew["MainUnit"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["QtyUnit"];
                    drAdjustNew["EndDate"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["VailDate"];
                    drAdjustNew["BeforPosition"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["goodAddress"];
                    drAdjustNew["AfterPosition"] = "货位设置单要设置一下";
                    drAdjustNew["iGroupType"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["iGroupType"];
                    drAdjustNew["iChangRate"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["iChangRate"];
                    drAdjustNew["BarCodeNoShow"] = dsNeedAdjust.Tables["T_MaterialCKProduct"].DefaultView[i]["BarCodeNoShow"];
                    dsAdjustPVouch.Tables["T_AdjustPVouchProduct"].Rows.Add(drAdjustNew);
                }
                //保存
                try
                {
                    if (dsAdjustPVouch.GetChanges() != null)
                    {
                        CustomizableDesignBLL.SaveData(dsAdjustPVouch.GetChanges(), dtnAdjustPVouchList);
                    }
                }
                catch (Exception ex)
                {
                    return "保存差异数据出错：" + ex.Message;
                }
                string strMsg = YYHuoWeiTiaoZheng(dsAdjustPVouch, strYongYouDBName, sAccID, sYear, sUserID, sPassword, sDate, sServer, dsAdjustPVouch.Tables[0].DefaultView[0]["SerialNum"].ToString());
                if (!string.IsNullOrEmpty(strMsg))
                {
                    return strMsg;
                }
                if (false)
                {
                    #region 回刷条码仓库和货位
                    #region 获取默认设置是否回刷仓库和货位
                    DataSet dsDeafault = new DataSet();
                    dtn = new DataTableName();
                    dtn.strSelectSQL = "SELECT  SysValue FROM dbo.T_DefaultValue  WHERE ClassNO='pdarefreshpos' ";
                    dtn.strTableName = "T_DefaultValue";
                    try
                    {
                        dsDeafault = CustomizableDesignBLL.GetData(dtn, false);
                    }
                    catch (Exception ex)
                    {
                        return "获取默认设置报错：" + ex.Message;
                    }
                    //
                    string strReFreshiPos = "否";
                    if (dsDeafault.Tables[0].DefaultView.Count > 0)
                        strReFreshiPos = dsDeafault.Tables[0].DefaultView[0]["SysValue"].ToString();
                    //
                    string strBarcWhCode = dsAdjustPVouch.Tables["T_AdjustPVouch"].DefaultView[0]["cWhName"].ToString();
                    //
                    strBarcWhCode = GetwhOrPoCodeAndName(strBarcWhCode, 0);
                    #endregion
                    #region 回刷货位仓库 语句
                    if (strReFreshiPos == "是")
                    {
                        List<string> strUpdateBarKCSqlList = new List<string>();
                        //
                        string strUpdateSql = string.Empty;
                        //
                        if (dsAdjustPVouch.Tables["T_AdjustPVouchProduct"].DefaultView.Count > 0)
                        {
                            foreach (DataRowView drv in dsAdjustPVouch.Tables["T_AdjustPVouchProduct"].DefaultView)
                            {
                                string strBarCode = drv["BarCode"].ToString();
                                //
                                string strBarcPosCode = drv["AfterPosition"].ToString();
                                //
                                strBarcPosCode = GetwhOrPoCodeAndName(strBarcPosCode, 0);
                                //
                                string strReFreshiPosWhere = string.Empty;

                                strReFreshiPosWhere = "  cWhCode='" + strBarcWhCode + "',cPosCode='" + strBarcPosCode + "' ";
                                string strUpdateSQL = string.Empty;
                                strUpdateSQL = "UPDATE dbo.T_BarCode SET   " + strReFreshiPosWhere + " WHERE BarCode='" + strBarCode + "'";
                                strUpdateBarKCSqlList.Add(strUpdateSQL);
                            }
                            //
                            try
                            {
                                CustomizableDesignBLL.ExecSQL(strUpdateBarKCSqlList);
                            }
                            catch (Exception ex)
                            {
                                return "生成U8货位调整成功，回刷条码仓库货位报错：" + ex.Message;
                            }
                        }
                    }
                    #endregion
                    #endregion
                }
                #endregion
            }
            return "";
        }
        #endregion
        #region 调拨单生成 PDA调拨单生成
        public string CreateDiaoBoOrder(DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {
            if (ds.Tables[0].DefaultView.Count == 0 || ds.Tables["T_DBStorageAppProduct"].DefaultView.Count == 0)
            {
                return "API接口传入的调拨单数据错误，数据行数为0!";
            }
            //
            string strPKValue = ds.Tables[0].DefaultView[0]["SerialNum"].ToString();
            //
            #region 判断是否已经生成过
            //判断是否已经搞过了
            string strISExists = "SELECT * FROM " + strYongYouDBName + ".dbo.TransVouch TransVouch where isnull(cDefine10,'')='" + strPKValue + "'";
            DataSet dsISExists = new DataSet();
            try
            {
                dsISExists = CustomizableDesignBLL.GetData(strISExists);
            }
            catch (Exception ex)
            {
                return "判断PDA调拨单已经生成U8调拨单，出错：" + ex.Message;
            }
            if (dsISExists != null && dsISExists.Tables[0].DefaultView.Count > 0)
            {
                string strU8Code = dsISExists.Tables[0].DefaultView[0]["cTVCode"].ToString();
                return "当前PDA调拨单" + strPKValue + "已经生成过U8调拨单" + strU8Code + "，不能重复生成";
            }
            #endregion
            // 返回值
            string strRet = "";
            #region 获取存货是否批次管理和仓库是否代管仓需要代管商
            string strMatrialCodeWhere = string.Empty;
            for (int iRow = 0; iRow < ds.Tables["T_DBStorageAppProduct"].DefaultView.Count; iRow++)
            {
                string strTCMaterialCode = ds.Tables["T_DBStorageAppProduct"].DefaultView[iRow]["cInvCode"].ToString(); //材料编码，string类型
                //
                if (string.IsNullOrEmpty(strTCMaterialCode))
                    continue;
                if (strMatrialCodeWhere == string.Empty)
                {
                    strMatrialCodeWhere = "'" + strTCMaterialCode + "'";
                }
                else
                {
                    strMatrialCodeWhere = strMatrialCodeWhere + ",'" + strTCMaterialCode + "'";
                }
            }
            //
            if (string.IsNullOrEmpty(strMatrialCodeWhere))
            {
                return "API接口传入的调拨单明细数据中获取存货编码为空!";
            }
            //
            DataSet dsinventory = new DataSet();
            List<DataTableName> dtnCKAndPCList = new List<DataTableName>();
            DataTableName dtnCKAndPC = new DataTableName();
            //
            dtnCKAndPC.strSelectSQL = "select cinvcode,bInvBatch  from " + strYongYouDBName + ".dbo.inventory where cinvcode in (" + strMatrialCodeWhere + ")";
            dtnCKAndPC.strTableName = "inventory";
            dtnCKAndPCList.Add(dtnCKAndPC);
            //
            try
            {
                dsinventory = CustomizableDesignBLL.GetData(dtnCKAndPCList, false);
            }
            catch (Exception ex)
            {
                return "获取存货信息失败，原因：" + ex.Message;
            }
            #endregion

            //
            DateTime dtCreateDate = DateTime.Now;
            //
            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/TransVouch/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/TransVouch/Add");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：12
            broker.AssignNormalValue("sVouchType", "12");


            //给BO表头参数DomHead赋值，此BO参数的业务类型为调拨单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            DomHead[0]["ctvcode"] = "test"; //单据号，string类型
            DomHead[0]["dtvdate"] = sDate; //日期，DateTime类型
            //
            string strZCWhCode = GetwhOrPoCodeAndName(ds.Tables["T_DBStorageApp"].DefaultView[0]["OutStorageName"].ToString(), 0);
            string strZCWhName = GetwhOrPoCodeAndName(ds.Tables["T_DBStorageApp"].DefaultView[0]["OutStorageName"].ToString(), 1);
            //
            string strZRWhCode = GetwhOrPoCodeAndName(ds.Tables["T_DBStorageApp"].DefaultView[0]["InStorageName"].ToString(), 0);
            string strZRWhName = GetwhOrPoCodeAndName(ds.Tables["T_DBStorageApp"].DefaultView[0]["InStorageName"].ToString(), 1);
            //
            DomHead[0]["cwhname"] = strZCWhName; //转出仓库，string类型
            DomHead[0]["cwhname_1"] = strZRWhName; //转入仓库，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            DomHead[0]["iverifystate"] = "0"; //iverifystate，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，string类型
            DomHead[0]["cbustype"] = ""; //业务类型，string类型
            //DomHead[0]["csourcecodels"] = ""; //零售来源单号，string类型
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            //sqg 暂无    DomHead[0]["ctranrequestcode"] = ds.Tables["T_DBStorageApp"].DefaultView[0]["OrderNUm"].ToString(); //调拨申请单号，string类型
            //DomHead[0]["cdepname_1"] = ""; //转出部门，string类型
            //DomHead[0]["cdepname"] = ""; //转入部门，string类型
            //DomHead[0]["crdname_1"] = ""; //出库类别，string类型
            //DomHead[0]["crdname"] = ""; //入库类别，string类型
            //DomHead[0]["cpersonname"] = ""; //经手人，string类型
            //DomHead[0]["dverifydate"] = ""; //审核日期，DateTime类型
            DomHead[0]["ctvmemo"] = "PDA生成"; //备注，string类型
            //DomHead[0]["parentscrp"] = ""; //母件损耗率(％)，double类型
            DomHead[0]["csource"] = "1"; //单据来源，int类型
            //DomHead[0]["iamount"] = ""; //现存量，string类型
            DomHead[0]["cmaker"] = ds.Tables["T_DBStorageApp"].DefaultView[0]["CreaterName"].ToString(); //制单人，string类型
            //DomHead[0]["cverifyperson"] = ""; //审核人，string类型
            //DomHead[0]["cfree1"] = ""; //自由项1，string类型
            //DomHead[0]["cfree2"] = ""; //自由项2，string类型
            //DomHead[0]["cfree3"] = ""; //自由项3，string类型
            //DomHead[0]["cfree4"] = ""; //自由项4，string类型
            //DomHead[0]["cfree5"] = ""; //自由项5，string类型
            //DomHead[0]["cfree6"] = ""; //自由项6，string类型
            //DomHead[0]["cfree7"] = ""; //自由项7，string类型
            //DomHead[0]["cfree8"] = ""; //自由项8，string类型
            //DomHead[0]["cfree9"] = ""; //自由项9，string类型
            //DomHead[0]["cfree10"] = ""; //自由项10，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["codepcode"] = "0501"; //转出部门编码，string类型  不用 是空值
            //DomHead[0]["cidepcode"] = "0502"; //转入部门编码，string类型  不用 是空值
            //DomHead[0]["cpersoncode"] = ""; //经手人编码，string类型
            DomHead[0]["cordcode"] = "24"; //出库类别编码，string类型  sqg 写死就可以了固定值
            DomHead[0]["cirdcode"] = "14"; //入库类别编码，string类型  sqg 写死就可以了固定值
            DomHead[0]["ciwhcode"] = strZRWhCode; //转入仓库编码，string类型
            DomHead[0]["cowhcode"] = strZCWhCode; //转出仓库编码，string类型
            //DomHead[0]["cmpocode"] = ""; //订单号，string类型
            //DomHead[0]["cpspcode"] = ""; //产品结构，string类型
            //DomHead[0]["btransflag"] = ""; //是否传递，string类型
            DomHead[0]["vt_id"] = "89"; //模版号，int类型
            DomHead[0]["iquantity"] = "0"; //产量，double类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["iproorderid"] = ""; //生产订单ID，string类型
            //DomHead[0]["cversion"] = ""; //版本号／替代标识，string类型
            //DomHead[0]["bomid"] = ""; //bomid，string类型
            //DomHead[0]["cordertype"] = ""; //订单类型，string类型
            //DomHead[0]["cinvname"] = ""; //产品名称，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            DomHead[0]["itransflag"] = "正向"; //调拨方向，int类型
            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            DomHead[0]["cdefine10"] = ds.Tables["T_DBStorageApp"].DefaultView[0]["SerialNum"].ToString(); //表头自定义项10，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型

            //给BO表体参数domBody赋值，此BO参数的业务类型为调拨单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = ds.Tables["T_DBStorageAppProduct"].DefaultView.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            for (int iRow = 0; iRow < ds.Tables["T_DBStorageAppProduct"].DefaultView.Count; iRow++)
            {
                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = "0"; //主关键字段，int类型
                domBody[iRow]["cinvcode"] = ds.Tables["T_DBStorageAppProduct"].DefaultView[iRow]["cInvCode"].ToString(); //存货编码，string类型
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型
                //domBody[iRow]["cbatchproperty8"] = ""; //批次属性8，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，string类型
                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["cbmemo"] = ""; //备注，string类型
                domBody[iRow]["irowno"] = (iRow + 1).ToString(); //行号，string类型
                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，string类型
                //domBody[iRow]["iinvsncount"] = ""; //序列号个数，string类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，string类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，string类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，string类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["ipresent"] = ""; //现存量，string类型
                //domBody[iRow]["ipresentnum"] = ""; //现存件数，string类型
                //domBody[iRow]["iavaquantity"] = ""; //可用量，string类型
                //domBody[iRow]["iavanum"] = ""; //可用件数，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["cbsourcecodels"] = ""; //零售来源单号，string类型
                //domBody[iRow]["cmolotcode"] = ""; //生产批号，string类型
                //domBody[iRow]["cinvoucherlineid"] = ""; //源单行ID，string类型
                //domBody[iRow]["cinvouchercode"] = ""; //源单号，string类型
                //domBody[iRow]["cinvouchertype"] = ""; //源单类型，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型

                /***************************** 以下是非必输字段 ****************************/
                //domBody[iRow]["issodid"] = ""; //销售订单子表ID，string类型
                //domBody[iRow]["idsodid"] = ""; //目标销售订单子表ID，string类型
                // domBody[iRow]["itrids"] = "1000012041"; //调拨申请单子表ID，int类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cinvaddcode"] = ""; //存货代码，string类型
                //domBody[iRow]["cinvname"] = ""; //存货名称，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //domBody[iRow]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iRow]["dmadedate"] = ""; //生产日期，DateTime类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["cinvstd"] = ""; //规格型号，string类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["cdsocode"] = ""; //目标需求跟踪号，string类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["cinvm_unit"] = ""; //主计量单位，string类型
                //domBody[iRow]["cinposname"] = ""; //调入货位，string类型
                string strZRCpositong = GetwhOrPoCodeAndName(ds.Tables["T_DBStorageApp"].DefaultView[0]["InPos"].ToString(), 0);
                string strZCCpositong = GetwhOrPoCodeAndName(ds.Tables["T_DBStorageApp"].DefaultView[0]["OutPos"].ToString(), 0);

                domBody[iRow]["cinposcode"] = strZRCpositong; //调入货位编码，string类型
                //domBody[iRow]["coutposname"] = ""; //调出货位，string类型
                domBody[iRow]["coutposcode"] = strZCCpositong; //调出货位编码，string类型
                // domBody[iRow]["cvmivencode"] = "0571189"; //代管商代码，string类型
                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cfree2"] = ""; //存货自由项2，string类型

                DataRow[] drSelectinventory = dsinventory.Tables[0].Select("cInvCode='" + ds.Tables["T_DBStorageAppProduct"].DefaultView[iRow]["cInvCode"].ToString() + "'");
                bool bInvBatch = false;
                if (drSelectinventory.Length > 0)
                    bInvBatch = drSelectinventory[0]["bInvBatch"] == DBNull.Value ? false : (bool)drSelectinventory[0]["bInvBatch"];
                if (bInvBatch)
                    domBody[iRow]["ctvbatch"] = ds.Tables["T_DBStorageAppProduct"].DefaultView[iRow]["BatchNo"].ToString(); //批号，string类型
                //domBody[iRow]["itvnum"] = ""; //件数，double类型
                //domBody[iRow]["iinvexchrate"] = ""; //换算率，double类型
                decimal decQty = ds.Tables["T_DBStorageAppProduct"].DefaultView[iRow]["Quantity"] == DBNull.Value ? 0 : (decimal)ds.Tables["T_DBStorageAppProduct"].DefaultView[iRow]["Quantity"];
                domBody[iRow]["itvquantity"] = Decimal.Round(decQty, 2); //数量，double类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["itvacost"] = ""; //单价，double类型
                //domBody[iRow]["csdemandmemo"] = ""; //需求分类代号说明，string类型
                //domBody[iRow]["cddemandmemo"] = ""; //目标需求分类代号说明，string类型
                //domBody[iRow]["comcode"] = ""; //委外订单号，string类型
                //domBody[iRow]["cmocode"] = ""; //生产订单号，string类型
                //domBody[iRow]["invcode"] = ""; //产品编码，string类型
                //domBody[iRow]["invname"] = ""; //产品，string类型
                //domBody[iRow]["imoseq"] = ""; //生产订单行号，string类型
                //domBody[iRow]["iomids"] = ""; //iomids，int类型
                //domBody[iRow]["imoids"] = ""; //imoids，int类型
                domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，string类型
                //domBody[iRow]["itvaprice"] = ""; //金额，double类型
                //domBody[iRow]["itvpcost"] = ""; //计划单价／售价，double类型
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["issotype"] = ""; //需求跟踪方式，int类型
                //domBody[iRow]["idsoseq"] = ""; //目标需求跟踪行号，string类型
                //domBody[iRow]["idsotype"] = ""; //目标需求跟踪方式，int类型
                //domBody[iRow]["bcosting"] = ""; //是否核算，string类型
                //domBody[iRow]["itvpprice"] = ""; //计划金额／售价金额，double类型
                //domBody[iRow]["cinva_unit"] = ""; //库存单位，string类型
                //domBody[iRow]["ddisdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型
                //
                //
                domBody[iRow]["cposition"] = strZRCpositong; //货位编码，string类型
                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型
                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["rdsid"] = ""; //对应入库单id，int类型
                domBody[iRow]["cdefine34"] = ds.Tables["T_DBStorageAppProduct"].DefaultView[iRow]["SerialID"].ToString(); ; //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["impoids"] = ""; //生产订单子表Id，int类型
                //domBody[iRow]["ctvcode"] = ""; //单据号，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //表体自定义项6，double类型
                //domBody[iRow]["citemcode"] = ""; //项目编码，string类型
                //domBody[iRow]["cname"] = ""; //项目，string类型
                //domBody[iRow]["citem_class"] = ""; //项目大类编码，string类型
                //domBody[iRow]["fsalecost"] = ""; //零售单价，double类型
                //domBody[iRow]["fsaleprice"] = ""; //零售金额，double类型
                //domBody[iRow]["citemcname"] = ""; //项目大类名称，string类型
                //domBody[iRow]["igrossweight"] = ""; //毛重，string类型
                //domBody[iRow]["inetweight"] = ""; //净重，string类型

            }

            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRet = "系统异常：" + sysEx.Message;

                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRet = "系统异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRet = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRet;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                //获取out/inout参数值

                //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                strRet = "失败！" + errMsgRet;
            }
            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));
            //结束本次调用，释放API资源
            broker.Release();
            return strRet;
        }
        #endregion
        #region 调拨单审核 PDA调拨单生成的单据审核
        public string AuditDiaoBoOrder(string strYongYouDBName, DataSet ds, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {
            string strCKNum = string.Empty;
            //
            if (ds.Tables[0].DefaultView.Count == 0 || ds.Tables["T_DBStorageAppProduct"].DefaultView.Count == 0)
            {
                return "API接口传入的调拨单数据错误，数据行数为0!";
            }
            string strPDASerialNum = ds.Tables["T_DBStorageApp"].DefaultView[0]["SerialNum"].ToString();
            //
            #region 获取材料出库单的数据
            DataSet dsCKAndPC = new DataSet();
            //审核
            List<DataTableName> DataTableNameverList = new List<DataTableName>();
            DataTableName DataTableNamever = new DataTableName();
            DataTableNamever.strSelectSQL = "select *,convert(nchar,convert(money,ufts),2) as ufts1 from " + strYongYouDBName + ".dbo.TransVouch  where isnull(cdefine10,'') ='" + strPDASerialNum + "'";
            DataTableNamever.strTableName = "TransVouch";
            DataTableNameverList.Add(DataTableNamever);
            try
            {
                dsCKAndPC = CustomizableDesignBLL.GetData(DataTableNameverList, false);
            }
            catch (Exception ex)
            {
                return "取U8材料出库数据出错：" + ex.Message;
            }
            #endregion
            //
            if (dsCKAndPC.Tables[0].DefaultView.Count == 0)
            {
                return "材料出库单号" + strCKNum + "获取U8数据失败，获取的数据行数为0!";
            }
            #region 判断调拨单是否已经审核了，审核过的提示不能重复审核
            string strcVerifyPerson = dsCKAndPC.Tables[0].DefaultView[0]["cVerifyPerson"].ToString();
            if (!string.IsNullOrEmpty(strcVerifyPerson))
            {
                return "材料出库单号" + strCKNum + "已经审核过了，不能重复审核!";
            }
            #endregion
            //获取调拨单的ID
            int iMaterialID = Convert.ToInt32(dsCKAndPC.Tables[0].DefaultView[0]["ID"]);
            //
            #region U8材料出库单出库单审核
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSerial = "";
            string sSubId = "AS";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/TransVouch/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/TransVouch/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            ////给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：12
            broker.AssignNormalValue("sVouchType", "12");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", iMaterialID.ToString());

            ////该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            ////给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            //broker.AssignNormalValue("cnnFrom",null);// new ADODB.Connection());

            ////给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", dsCKAndPC.Tables[0].DefaultView[0]["ufts1"]);

            ////该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            ////给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            ////给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            ////给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());

            //获取普通返回值。此返回值数据类型为System.String，此参数按值传递，表示成功返回空串
            System.String resultMsg = broker.GetResult("errMsg") as System.String;
            if (result == false)
            {
                //结束本次调用，释放API资源
                broker.Release();
                return resultMsg;
            }
            //结束本次调用，释放API资源
            broker.Release();
            #endregion
            return "";
        }
        #endregion
        #region 调拨单审核
        public string AuditDBStorage(string strYongYouDBName, DataSet ds, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {
            string strCKNum = string.Empty;
            //
            if (ds.Tables[0].DefaultView.Count == 0 || ds.Tables["T_MaterialCKProduct"].DefaultView.Count == 0)
            {
                return "API接口传入的材料出库数据错误，数据行数为0!";
            }
            //
            strCKNum = ds.Tables[0].DefaultView[0]["CKNum"].ToString();
            if (string.IsNullOrEmpty(strCKNum))
            {
                return "材料出库单号为空，无法审核!";
            }
            //
            #region 获取调拨单的数据
            DataSet dsCKAndPC = new DataSet();
            //审核
            List<DataTableName> DataTableNameverList = new List<DataTableName>();
            DataTableName DataTableNamever = new DataTableName();
            DataTableNamever.strSelectSQL = "select *,convert(nchar,convert(money,ufts),2) as ufts1 from " + strYongYouDBName + ".dbo.TransVouch  where cTVCode ='" + strCKNum + "'";
            DataTableNamever.strTableName = "TransVouch";
            DataTableNameverList.Add(DataTableNamever);
            //
            DataTableNamever = new DataTableName();
            DataTableNamever.strSelectSQL = "select *from " + strYongYouDBName + ".dbo.TransVouchs where   cTVCode ='" + strCKNum + "'";
            DataTableNamever.strTableName = "TransVouchs";
            DataTableNameverList.Add(DataTableNamever);
            //
            DataTableNamever = new DataTableName();
            DataTableNamever.strSelectSQL = "select * from " + strYongYouDBName + ".dbo.Inventory where cInvCode in (select cInvCode from " + strYongYouDBName + ".dbo.TransVouchs where cTVCode ='" + strCKNum + "')";
            DataTableNamever.strTableName = "Inventory";
            DataTableNameverList.Add(DataTableNamever);
            try
            {
                dsCKAndPC = CustomizableDesignBLL.GetData(DataTableNameverList, false);
            }
            catch (Exception ex)
            {
                return "取U8调拨单数据出错：" + ex.Message;
            }
            #endregion
            //
            if (dsCKAndPC.Tables[0].DefaultView.Count == 0 || dsCKAndPC.Tables["TransVouchs"].DefaultView.Count == 0)
            {
                return "调拨单号" + strCKNum + "获取U8数据失败，获取的数据行数为0!";
            }
            #region 判断调拨单是否已经审核了，审核过的提示不能重复审核
            string strcVerifyPerson = dsCKAndPC.Tables[0].DefaultView[0]["cVerifyPerson"].ToString();
            if (!string.IsNullOrEmpty(strcVerifyPerson))
            {
                return "调拨单号" + strCKNum + "已经审核过了，不能重复审核!";
            }
            #endregion
            //
            #region 创建一个根据批次，存货编码，货位，汇总数量的表
            DataTable dtRealQty = new DataTable();
            dtRealQty.Columns.Add(new DataColumn("SerialID", typeof(int)));
            dtRealQty.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("cPosCode", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("SHBacthNo", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("Quantity", typeof(decimal)));
            #endregion
            #region 汇总扫描明细表
            int iSerialID = 1;
            for (int i = 0; i < ds.Tables["T_MaterialCKProduct"].DefaultView.Count; i++)
            {
                string strcInvCode = ds.Tables["T_MaterialCKProduct"].DefaultView[i]["ProductCode"].ToString();
                string strSHBacthNo = ds.Tables["T_MaterialCKProduct"].DefaultView[i]["BatchNo"].ToString();
                string strcPosition = ds.Tables["T_MaterialCKProduct"].DefaultView[i]["goodAddress"].ToString();

                string strcPosiCode = GetwhOrPoCodeAndName(strcPosition, 0);

                //数量
                decimal decBarCount = 0;
                //
                if (ds.Tables["T_MaterialCKProduct"].DefaultView[i]["Quantity"] != DBNull.Value)
                {
                    decBarCount = Convert.ToDecimal(ds.Tables["T_MaterialCKProduct"].DefaultView[i]["Quantity"].ToString());
                }
                //

                dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and  isnull(cPosCode,'') ='" + strcPosiCode + "' and  isnull(SHBacthNo,'') ='" + strSHBacthNo + "'  ";
                if (dtRealQty.DefaultView.Count > 0)
                {
                    decimal decBaseQty = Convert.ToDecimal(dtRealQty.DefaultView[0]["Quantity"].ToString());
                    //
                    dtRealQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                    dtRealQty.DefaultView[0].EndEdit();
                }
                else
                {
                    DataRow drNew = dtRealQty.NewRow();
                    drNew["SerialID"] = iSerialID;
                    drNew["cInvCode"] = strcInvCode;
                    drNew["cPosCode"] = strcPosiCode;
                    drNew["SHBacthNo"] = strSHBacthNo;
                    drNew["Quantity"] = decBarCount;
                    dtRealQty.Rows.Add(drNew);
                    iSerialID++;
                }
                //
            }
            dtRealQty.DefaultView.RowFilter = "";
            #endregion
            #region 判断是否扫的存货批次货位不是其他出库单的
            foreach (DataRowView drv in dtRealQty.DefaultView)
            {
                string strcBatch = drv["SHBacthNo"].ToString();
                string strcInvCode = drv["cInvCode"].ToString();
                string strcPosition = drv["cPosCode"].ToString();
                //
                DataRow[] drU8Select = dsCKAndPC.Tables["TransVouchs"].Select("cInvCode='" + strcInvCode + "' and  isnull(coutposcode,'')  ='" + strcPosition + "' and isnull(cTVBatch,'') ='" + strcBatch + "'  ");
                //
                if (drU8Select.Length == 0)
                {
                    return "存货" + strcInvCode + "批次" + strcBatch + "货位" + strcPosition + "的不是当前调拨单需要出库的，不能审核";
                }
            }
            #endregion
            #region 创建一个根据批次，存货编码，货位，汇总数量的表
            DataTable dtU8OutQty = new DataTable();
            dtU8OutQty.Columns.Add(new DataColumn("SerialID", typeof(int)));
            dtU8OutQty.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dtU8OutQty.Columns.Add(new DataColumn("cPosCode", typeof(string)));
            dtU8OutQty.Columns.Add(new DataColumn("SHBacthNo", typeof(string)));
            dtU8OutQty.Columns.Add(new DataColumn("Quantity", typeof(decimal)));
            #endregion
            #region 汇总调拨单表
            int iSerialIDU8 = 1;
            for (int i = 0; i < dsCKAndPC.Tables["TransVouchs"].DefaultView.Count; i++)
            {
                string strcInvCode = dsCKAndPC.Tables["TransVouchs"].DefaultView[i]["cInvCode"].ToString();
                string strSHBacthNo = dsCKAndPC.Tables["TransVouchs"].DefaultView[i]["cTVBatch"].ToString();
                string strcPosition = dsCKAndPC.Tables["TransVouchs"].DefaultView[i]["coutposcode"].ToString();

                //数量
                decimal decBarCount = 0;
                //
                if (dsCKAndPC.Tables["TransVouchs"].DefaultView[i]["iTVQuantity"] != DBNull.Value)
                {
                    decBarCount = Convert.ToDecimal(dsCKAndPC.Tables["TransVouchs"].DefaultView[i]["iTVQuantity"].ToString());
                }
                //

                dtU8OutQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and isnull(cPosCode,'') ='" + strcPosition + "' and isnull(SHBacthNo,'') ='" + strSHBacthNo + "'  ";
                if (dtU8OutQty.DefaultView.Count > 0)
                {
                    decimal decBaseQty = Convert.ToDecimal(dtU8OutQty.DefaultView[0]["Quantity"].ToString());
                    //
                    dtU8OutQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                    dtU8OutQty.DefaultView[0].EndEdit();
                }
                else
                {
                    DataRow drNew = dtU8OutQty.NewRow();
                    drNew["SerialID"] = iSerialID;
                    drNew["cInvCode"] = strcInvCode;
                    drNew["cPosCode"] = strcPosition;
                    drNew["SHBacthNo"] = strSHBacthNo;
                    drNew["Quantity"] = decBarCount;
                    dtU8OutQty.Rows.Add(drNew);
                    iSerialIDU8++;
                }
                //
            }
            dtU8OutQty.DefaultView.RowFilter = "";
            #endregion
            #region 判断对应的批次货位数量是否超出，是否少扫描了
            List<DataTableName> dtnExecList = new List<DataTableName>();
            dtU8OutQty.DefaultView.RowFilter = "";
            foreach (DataRowView drv in dtU8OutQty.DefaultView)
            {
                string strcBatch = drv["SHBacthNo"].ToString();
                string strcInvCode = drv["cInvCode"].ToString();
                string strcPosition = drv["cPosCode"].ToString();
                //
                decimal decU8OutQty = drv["Quantity"] == DBNull.Value ? 0 : (decimal)drv["Quantity"];

                dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and isnull(cPosCode,'')  ='" + strcPosition + "' and isnull(SHBacthNo,'') ='" + strcBatch + "'  ";
                //
                if (dtRealQty.DefaultView.Count == 0)
                {
                    continue;
                }
                //扫描数量
                decimal decScanQty = 0;
                foreach (DataRowView drvScan in dtRealQty.DefaultView)
                {
                    decimal decItem = drvScan["Quantity"] == DBNull.Value ? 0 : (decimal)drvScan["Quantity"];
                    decScanQty = decScanQty + decItem;
                }
                //
                //相等或者大于（大于要根据自定义项3来判断）
                if (decU8OutQty > decScanQty)
                {
                    return "存货" + strcInvCode + "批次" + strcBatch + "货位" + strcPosition + "的出库数量" + decU8OutQty.ToString("###,###,##0.00###") + "，当前扫描数量" + decScanQty.ToString("###,###,##0.00###") + "，小于出库数量，请检查";
                }
                //要根据存货自定义项3，判断是否允许超出
                if (decU8OutQty < decScanQty)
                {
                    //自定义项2=是，允许大于出库数量
                    DataRow[] drInventorySelectRows = dsCKAndPC.Tables["Inventory"].Select(" cInvCode='" + strcInvCode + "'");
                    if (drInventorySelectRows.Length == 0)
                    {
                        return "存货档案" + strcInvCode + "不存在";
                    }
                    if (drInventorySelectRows[0]["cInvDefine3"].ToString() != "是")
                    {
                        return "存货" + strcInvCode + "批次" + strcBatch + "货位" + strcPosition + "的出库数量" + decU8OutQty.ToString("###,###,##0.00###") + "，当前扫描数量" + decScanQty.ToString("###,###,##0.00###") + "，请检查";
                    }
                }
                //根据批次 货位 存货编码,刷cDefine34
                DataTableName dtnExec = new DataTableName();
                dtnExec.strExecSQL = "UPDATE " + strYongYouDBName + ".dbo.TransVouchs set cDefine34=" + ds.Tables[0].DefaultView[0]["ID"].ToString() + " where ISNULL(cInvCode,'')='" + strcInvCode + "' and ISNULL(coutposcode,'')='" + strcPosition + "' and ISNULL(cTVBatch,'')='" + strcBatch + "' and cTVCode ='" + strCKNum + "'";
                dtnExecList.Add(dtnExec);
            }
            //更新SQL
            try
            {
                if (dtnExecList.Count > 0)
                    CustomizableDesignBLL.ExecSQL(dtnExecList);
            }
            catch (Exception ex)
            {
                return "更新调拨单的cDefine34出错：" + ex.Message;
            }
            #endregion
            //获取调拨单的ID
            int iMaterialID = Convert.ToInt32(dsCKAndPC.Tables[0].DefaultView[0]["ID"]);
            #region 判断cDefine34字段，是否全部有值了,以及生成需要货位调整单的数据，为什么放在这里，是想在出库审核前再判断一下
            List<DataTableName> dtnNeedAdjustList = new List<DataTableName>();
            //
            DataTableName dtn = new DataTableName();
            dtn.strSelectSQL = "select * from " + strYongYouDBName + ".dbo.TransM where cTVCode ='" + strCKNum + "'";
            dtn.strTableName = "TransM";
            dtnNeedAdjustList.Add(dtn);
            //
            dtn = new DataTableName();
            dtn.strSelectSQL = "select *,'' NeedModify from " + strYongYouDBName + ".dbo.Transd where cTVCode ='" + strCKNum + "'";
            dtn.strTableName = "Transd";
            dtnNeedAdjustList.Add(dtn);
            //
            dtn = new DataTableName();
            dtn.strSelectSQL = "select cInvCode,ISNULL(coutposcode,'') coutposcode,isnull(cTVBatch,'') cTVBatch,SUM(iTVQuantity) iTVQuantity \r\n" +
                                "from " + strYongYouDBName + ".dbo.TransVouchs \r\n" +
                                "where cTVCode='" + strCKNum + "' \r\n" +
                               " GROUP BY cInvCode,ISNULL(coutposcode,''),isnull(cTVBatch,'')";
            dtn.strTableName = "Group_TransVouchs";
            dtnNeedAdjustList.Add(dtn);
            //
            dtn = new DataTableName();
            dtn.strSelectSQL = "SELECT T_MaterialCKProduct.ProductCode,ISNULL(T_MaterialCKProduct.goodAddress,'') goodAddress,ISNULL(T_MaterialCKProduct.BatchNo,'') BatchNo,SUM(T_MaterialCKProduct.Quantity) Quantity \r\n" +
                                "FROM T_MaterialCK \r\n" +
                                "INNER join T_MaterialCKProduct ON T_MaterialCK.serialnum=T_MaterialCKproduct.serialnum \r\n" +
                                "WHERE T_MaterialCK.id IN (select cDefine34 \r\n" +
                                                            "from " + strYongYouDBName + ".dbo.TransVouchs \r\n" +
                                                            "where cTVCode ='" + strCKNum + "') \r\n" +
                                 " GROUP BY  T_MaterialCKProduct.ProductCode,ISNULL(T_MaterialCKProduct.goodAddress,''),ISNULL(T_MaterialCKProduct.BatchNo,'')";
            dtn.strTableName = "T_Group_MaterialCKProduct";
            dtnNeedAdjustList.Add(dtn);
            //
            DataSet dsNeedAdjust = new DataSet();
            try
            {
                dsNeedAdjust = CustomizableDesignBLL.GetData(dtnNeedAdjustList, false);
            }
            catch (Exception ex)
            {
                return "取U8调拨单数据出错：" + ex.Message;
            }
            bool bISAll = dsNeedAdjust.Tables["Transd"].Select("isnull(cDefine34,0)=0").Length == 0;
            if (!bISAll)
            {
                return "";
            }
            //先处理货位
            foreach (DataRowView drv in dsNeedAdjust.Tables["T_Group_MaterialCKProduct"].DefaultView)
            {
                drv["goodAddress"] = GetwhOrPoCodeAndName(drv["goodAddress"].ToString(), 0);
                drv.EndEdit();
            }
            //多出来的数量，加到最后一行
            foreach (DataRowView drv in dsNeedAdjust.Tables["Group_TransVouchs"].DefaultView)
            {
                string strProductCode = drv["cInvCode"].ToString();
                string strgoodAddress = drv["coutposcode"].ToString();
                string strBatchNo = drv["cTVBatch"].ToString();
                decimal deciTVQuantity = drv["iTVQuantity"] == DBNull.Value ? 0 : Convert.ToDecimal(drv["iTVQuantity"].ToString());
                //
                object objPDAQuantity = dsNeedAdjust.Tables["T_Group_MaterialCKProduct"].Compute("Sum(Quantity)", "isnull(ProductCode,'')='" + strProductCode + "' and isnull(goodAddress,'')='" + strgoodAddress + "' and isnull(BatchNo,'')='" + strBatchNo + "'");
                decimal decPDAQuantity = objPDAQuantity == null || objPDAQuantity == DBNull.Value ? 0 : Convert.ToDecimal(objPDAQuantity.ToString());
                if (decPDAQuantity > deciTVQuantity)
                {
                    DataRow[] drTransVouchsSelectRows = dsNeedAdjust.Tables["Transd"].Select("isnull(cInvCode,'')='" + strProductCode + "' and isnull(coutposcode,'')='" + strgoodAddress + "' and isnull(cTVBatch,'')='" + strBatchNo + "'", "irowno desc");
                    if (drTransVouchsSelectRows.Length > 0)
                    {
                        drTransVouchsSelectRows[0]["NeedModify"] = "是";
                        drTransVouchsSelectRows[0]["iTVQuantity"] = decPDAQuantity - deciTVQuantity + (drTransVouchsSelectRows[0]["iTVQuantity"] == DBNull.Value ? 0 : Convert.ToDecimal(drTransVouchsSelectRows[0]["iTVQuantity"].ToString()));
                        drTransVouchsSelectRows[0].EndEdit();
                    }
                }
            }
            #endregion
            if (dsNeedAdjust.Tables["Transd"].Select("isnull(NeedModify,'')='是'").Length > 0)
            {
                string strMsg = ModifyDBStorage(dsNeedAdjust, strYongYouDBName, sAccID, sYear, sUserID, sPassword, sDate, sServer, ds.Tables[0].DefaultView[0]["SerialNum"].ToString());
                if (!string.IsNullOrEmpty(strMsg))
                {
                    return strMsg;
                }
                try
                {
                    dsCKAndPC = CustomizableDesignBLL.GetData(DataTableNameverList, false);
                }
                catch (Exception ex)
                {
                    return "修改调拨单成功，但是重新获取数据出错：" + ex.Message;
                }
            }
            #region U8调拨单审核
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSerial = "";
            string sSubId = "AS";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/TransVouch/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/TransVouch/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            ////给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：12
            broker.AssignNormalValue("sVouchType", "12");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", iMaterialID.ToString());

            ////该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            ////给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            //broker.AssignNormalValue("cnnFrom",null);// new ADODB.Connection());

            ////给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", dsCKAndPC.Tables[0].DefaultView[0]["ufts1"]);

            ////该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            ////给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            ////给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            ////给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());

            //获取普通返回值。此返回值数据类型为System.String，此参数按值传递，表示成功返回空串
            System.String resultMsg = broker.GetResult("errMsg") as System.String;
            if (result == false)
            {
                //结束本次调用，释放API资源
                broker.Release();
                return resultMsg;
            }
            //结束本次调用，释放API资源
            broker.Release();
            #endregion

            return "";
        }
        #endregion
        #region 调用U8API的辅助类
        private void setAttribute(MSXML2.IXMLDOMElement nd, string name, object value)
        {
            string strValue = "";
            if (value != null && value != DBNull.Value)
                strValue = value.ToString();
            nd.setAttribute(name, strValue);
        }
        #endregion
        #region 修改调拨单
        public string ModifyDBStorage(DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strPKValue)
        {
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                return "登陆失败，原因：" + u8Login.ShareString;
            }
            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：修改单据的地址标识为：U8API/TransVouch/Update
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/TransVouch/Update");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：12
            broker.AssignNormalValue("sVouchType", "12");


            //给BO表头参数DomHead赋值，此BO参数的业务类型为调拨单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())
            string strConn = CustomizableDesignDAL.strConnectString;
            strConn = "Provider=SQLOLEDB;" + strConn;
            ADODB.Connection oCon = new ADODB.Connection();
            oCon.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
            oCon.ConnectionString = strConn;
            oCon.Open(strConn, "", "", -1);
            //
            MSXML2.DOMDocument domHead = new DOMDocument();//单据表头DOM
            //MSXML2.DOMDocument domBody = new DOMDocument();//单据表体DOM
            MSXML2.IXMLDOMElement eleHead;
            MSXML2.IXMLDOMElement eleBody;
            MSXML2.IXMLDOMElement ele;
            ADODB.Recordset rs = new ADODB.Recordset();
            string strSQL;

            rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient;

            strSQL = "select * from " + strYongYouDBName + ".DBO.TransM where 1=0";
            rs.Open(strSQL, oCon, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 0);
            rs.Save(domHead, ADODB.PersistFormatEnum.adPersistXML);
            rs.Close();

            //增加表头数据节点z:row
            eleHead = domHead.selectSingleNode("//rs:data") as MSXML2.IXMLDOMElement;
            ele = domHead.createElement("z:row");
            //'UPGRADE_WARNING: 未能解析对象 ele 的默认属性。 单击以获得更多信息:“ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"”
            eleHead.appendChild(ele);

            //方法二是构造BusinessObject对象，具体方法如下：
            //BusinessObject DomHead = broker.GetBoParam("DomHead");
            //DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            setAttribute(ele, "id", ds.Tables["TransM"].DefaultView[0]["id"].ToString());// "0"; //主关键字段，int类型
            setAttribute(ele, "ctvcode", ds.Tables["TransM"].DefaultView[0]["ctvcode"].ToString());// "0000000006"; //单据号，string类型
            if (ds.Tables["TransM"].DefaultView[0]["dtvdate"] != DBNull.Value)
            {
                DateTime dtvDate = (DateTime)ds.Tables["TransM"].DefaultView[0]["dtvdate"];
                setAttribute(ele, "dtvdate", dtvDate.ToString("yyyy-MM-dd")); //日期，DateTime类型
            }
            setAttribute(ele, "cwhname", ds.Tables["TransM"].DefaultView[0]["cwhname"].ToString());//"PC机材料仓库"; //转出仓库，string类型
            setAttribute(ele, "cwhname_1", ds.Tables["TransM"].DefaultView[0]["cwhname_1"].ToString());//"手机主辅料仓库(有货位)"; //转入仓库，string类型
            //setAttribute(ele, "chinvsn"] = ""; //序列号，string类型
            setAttribute(ele, "ireturncount", "0"); //ireturncount，string类型
            setAttribute(ele, "iverifystate", "0"); //iverifystate，string类型
            setAttribute(ele, "iswfcontrolled", "0"); //iswfcontrolled，string类型
            setAttribute(ele, "cbustype", ds.Tables["TransM"].DefaultView[0]["cbustype"].ToString());// ""; //业务类型，string类型
            //setAttribute(ele, "csourcecodels"] = ""; //零售来源单号，string类型
            //setAttribute(ele, "csysbarcode", ds.Tables["TransM"].DefaultView[0]["csysbarcode"].ToString());//单据条码，string类型

            /***************************** 以下是非必输字段 ****************************/
            //setAttribute(ele, "cmodifyperson"] = ""; //修改人，string类型
            //setAttribute(ele, "dmodifydate"] = ""; //修改日期，DateTime类型
            //setAttribute(ele, "dnmaketime"] = ""; //制单时间，DateTime类型
            //setAttribute(ele, "dnmodifytime"] = ""; //修改时间，DateTime类型
            //setAttribute(ele, "dnverifytime"] = ""; //审核时间，DateTime类型
            if (ds.Tables["TransM"].DefaultView[0]["ctranrequestcode"].ToString() != "")
                setAttribute(ele, "ctranrequestcode", ds.Tables["TransM"].DefaultView[0]["ctranrequestcode"].ToString()); //调拨申请单号，string类型
            //setAttribute(ele, "cdepname_1"] = ""; //转出部门，string类型
            //setAttribute(ele, "cdepname"] = ""; //转入部门，string类型
            //setAttribute(ele, "crdname_1"] = ""; //出库类别，string类型
            //setAttribute(ele, "crdname"] = ""; //入库类别，string类型
            //setAttribute(ele, "cpersonname"] = ""; //经手人，string类型
            //setAttribute(ele, "dverifydate"] = ""; //审核日期，DateTime类型
            setAttribute(ele, "ctvmemo", "测试123"); //备注，string类型
            //setAttribute(ele, "parentscrp"] = ""; //母件损耗率(％)，double类型
            setAttribute(ele, "csource", ds.Tables["TransM"].DefaultView[0]["csource"].ToString());// "1"; //单据来源，int类型
            //setAttribute(ele, "iamount"] = ""; //现存量，string类型
            setAttribute(ele, "cmaker", "demo"); //制单人，string类型
            //setAttribute(ele, "cverifyperson"] = ""; //审核人，string类型
            //setAttribute(ele, "cfree1"] = ""; //自由项1，string类型
            //setAttribute(ele, "cfree2"] = ""; //自由项2，string类型
            //setAttribute(ele, "cfree3"] = ""; //自由项3，string类型
            //setAttribute(ele, "cfree4"] = ""; //自由项4，string类型
            //setAttribute(ele, "cfree5"] = ""; //自由项5，string类型
            //setAttribute(ele, "cfree6"] = ""; //自由项6，string类型
            //setAttribute(ele, "cfree7"] = ""; //自由项7，string类型
            //setAttribute(ele, "cfree8"] = ""; //自由项8，string类型
            //setAttribute(ele, "cfree9"] = ""; //自由项9，string类型
            //setAttribute(ele, "cfree10"] = ""; //自由项10，string类型
            setAttribute(ele, "ufts", ds.Tables["TransM"].DefaultView[0]["ufts"].ToString());//时间戳，string类型
            setAttribute(ele, "codepcode", ds.Tables["TransM"].DefaultView[0]["codepcode"].ToString());//"0501"; //转出部门编码，string类型
            setAttribute(ele, "cidepcode", ds.Tables["TransM"].DefaultView[0]["cidepcode"].ToString());//"0502"; //转入部门编码，string类型
            //setAttribute(ele, "cpersoncode"] = ""; //经手人编码，string类型
            setAttribute(ele, "cordcode", ds.Tables["TransM"].DefaultView[0]["cordcode"].ToString());// "24"; //出库类别编码，string类型
            setAttribute(ele, "cirdcode", ds.Tables["TransM"].DefaultView[0]["cirdcode"].ToString());// "14"; //入库类别编码，string类型
            setAttribute(ele, "ciwhcode", ds.Tables["TransM"].DefaultView[0]["ciwhcode"].ToString());//"01"; //转入仓库编码，string类型
            setAttribute(ele, "cowhcode", ds.Tables["TransM"].DefaultView[0]["cowhcode"].ToString());//"02"; //转出仓库编码，string类型
            if (ds.Tables["TransM"].DefaultView[0]["cmpocode"].ToString() != "")
                setAttribute(ele, "cmpocode", ds.Tables["TransM"].DefaultView[0]["cmpocode"].ToString()); //订单号，string类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["ctranrequestcode"].ToString() != "")
                setAttribute(ele, "cpspcode", ds.Tables["TransM"].DefaultView[0]["ctranrequestcode"].ToString()); //产品结构，string类型
            //setAttribute(ele, "btransflag"] = ""; //是否传递，string类型
            setAttribute(ele, "vt_id", ds.Tables["TransM"].DefaultView[0]["vt_id"].ToString());// "89"; //模版号，int类型
            if (ds.Tables["TransM"].DefaultView[0]["iquantity"] == DBNull.Value)
                setAttribute(ele, "iquantity", 0);
            else
                setAttribute(ele, "iquantity", ds.Tables["TransM"].DefaultView[0]["iquantity"].ToString());// "100"; //产量，double类型
            //setAttribute(ele, "iavaquantity"] = ""; //可用量，string类型
            //setAttribute(ele, "iavanum"] = ""; //可用件数，string类型
            //setAttribute(ele, "ipresentnum"] = ""; //现存件数，string类型
            //setAttribute(ele, "iproorderid"] = ""; //生产订单ID，string类型
            //setAttribute(ele, "cversion"] = ""; //版本号／替代标识，string类型
            //setAttribute(ele, "bomid"] = ""; //bomid，string类型
            //setAttribute(ele, "cordertype"] = ""; //订单类型，string类型
            //setAttribute(ele, "cinvname"] = ""; //产品名称，string类型
            //setAttribute(ele, "ilowsum"] = ""; //最低库存量，string类型
            //setAttribute(ele, "itopsum"] = ""; //最高库存量，string类型
            //setAttribute(ele, "cdefine16"] = ""; //表头自定义项16，double类型
            //setAttribute(ele, "isafesum"] = ""; //安全库存量，string类型
            //setAttribute(ele, "caccounter"] = ""; //记账人，string类型
            //setAttribute(ele, "ipresent"] = ""; //现存量，string类型
            if (ds.Tables["TransM"].DefaultView[0]["cdefine1"].ToString() != "")
                setAttribute(ele, "cdefine1", ds.Tables["TransM"].DefaultView[0]["cdefine1"].ToString()); //表头自定义项1，string类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine2"].ToString() != "")
                setAttribute(ele, "cdefine2", ds.Tables["TransM"].DefaultView[0]["cdefine2"].ToString());//表头自定义项2，string类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine3"].ToString() != "")
                setAttribute(ele, "cdefine3", ds.Tables["TransM"].DefaultView[0]["cdefine3"].ToString()); //表头自定义项3，string类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine4"] != DBNull.Value)
                setAttribute(ele, "cdefine4", ds.Tables["TransM"].DefaultView[0]["cdefine4"].ToString()); //表头自定义项4，DateTime类型
            setAttribute(ele, "itransflag", ds.Tables["TransM"].DefaultView[0]["itransflag"].ToString());//"正向"; //调拨方向，int类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine5"] != DBNull.Value)
                setAttribute(ele, "cdefine5", ds.Tables["TransM"].DefaultView[0]["cdefine5"].ToString()); //表头自定义项5，int类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine6"] != DBNull.Value)
                setAttribute(ele, "cdefine6", ds.Tables["TransM"].DefaultView[0]["cdefine6"].ToString());//表头自定义项6，DateTime类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine7"] != DBNull.Value)
                setAttribute(ele, "cdefine7", ds.Tables["TransM"].DefaultView[0]["cdefine7"].ToString()); //表头自定义项7，double类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine8"].ToString() != "")
                setAttribute(ele, "cdefine8", ds.Tables["TransM"].DefaultView[0]["cdefine8"].ToString()); //表头自定义项8，string类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine9"].ToString() != "")
                setAttribute(ele, "cdefine9", ds.Tables["TransM"].DefaultView[0]["cdefine9"].ToString()); //表头自定义项9，string类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine10"].ToString() != "")
                setAttribute(ele, "cdefine10", ds.Tables["TransM"].DefaultView[0]["cdefine10"].ToString());  //表头自定义项10，string类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine11"].ToString() != "")
                setAttribute(ele, "cdefine11", ds.Tables["TransM"].DefaultView[0]["cdefine11"].ToString()); //表头自定义项11，string类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine12"].ToString() != "")
                setAttribute(ele, "cdefine12", ds.Tables["TransM"].DefaultView[0]["cdefine12"].ToString()); //表头自定义项12，string类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine13"].ToString() != "")
                setAttribute(ele, "cdefine13", ds.Tables["TransM"].DefaultView[0]["cdefine13"].ToString());//表头自定义项13，string类型
            //
            if (ds.Tables["TransM"].DefaultView[0]["cdefine14"].ToString() != "")
                setAttribute(ele, "cdefine14", ds.Tables["TransM"].DefaultView[0]["cdefine14"].ToString()); //表头自定义项14，string类型
            // 
            if (ds.Tables["TransM"].DefaultView[0]["cdefine15"] != DBNull.Value)
                setAttribute(ele, "cdefine15", ds.Tables["TransM"].DefaultView[0]["cdefine15"].ToString()); //表头自定义项15，int类型

            broker.AssignNormalValue("DomHead", domHead);
            //给BO表体参数domBody赋值，此BO参数的业务类型为调拨单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())
            //方法一是直接传入MSXML2.DOMDocumentClass对象

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = ds.Tables["Transd"].DefaultView.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            ds.Tables["Transd"].DefaultView.Sort = "irowno";
            /****************************** 以下是必输字段 ****************************/
            for (int i = 0; i < ds.Tables["Transd"].DefaultView.Count; i++)
            {
                domBody[i]["autoid"] = ds.Tables["Transd"].DefaultView[i]["autoid"].ToString();// "0"; //主关键字段，int类型
                domBody[i]["cinvcode"] = ds.Tables["Transd"].DefaultView[i]["cinvcode"].ToString();// "01019002063"; //存货编码，string类型
                domBody[i]["editprop"] = "M"; //编辑属性：A表新增，M表修改，D表删除，string类型
                //domBody[i] "strowguid"] = ""; //rowguid，string类型
                //domBody[i] "cbatchproperty7"] = ""; //批次属性7，string类型
                //domBody[i] "cbatchproperty8"] = ""; //批次属性8，string类型
                //domBody[i] "cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[i] "cbatchproperty10"] = ""; //批次属性10，string类型
                //domBody[i] "cciqbookcode"] = ""; //手册号，string类型
                domBody[i]["cbmemo"] = "abc"; //备注，string类型
                domBody[i]["irowno"] = ds.Tables["Transd"].DefaultView[i]["irowno"].ToString();//"1"; //行号，string类型
                //domBody[i] "cbinvsn"] = ""; //序列号，string类型
                //domBody[i] "cbatchproperty1"] = ""; //批次属性1，string类型
                //domBody[i] "iinvsncount"] = ""; //序列号个数，string类型
                //domBody[i] "cbatchproperty2"] = ""; //批次属性2，string类型
                //domBody[i] "cbatchproperty3"] = ""; //批次属性3，string类型
                //domBody[i] "cbatchproperty4"] = ""; //批次属性4，string类型
                //domBody[i] "cbatchproperty5"] = ""; //批次属性5，string类型
                //domBody[i] "cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[i] "ipresent"] = ""; //现存量，string类型
                //domBody[i] "ipresentnum"] = ""; //现存件数，string类型
                //domBody[i] "iavaquantity"] = ""; //可用量，string类型
                //domBody[i] "iavanum"] = ""; //可用件数，string类型
                //domBody[i] "cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[i] "cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[i] "cbsourcecodels"] = ""; //零售来源单号，string类型
                //domBody[i] "cmolotcode"] = ""; //生产批号，string类型
                //domBody[i] "cinvoucherlineid"] = ""; //源单行ID，string类型
                //domBody[i] "cinvouchercode"] = ""; //源单号，string类型
                //domBody[i] "cinvouchertype"] = ""; //源单类型，string类型
                //domBody[i] "taskguid"] = ""; //taskguid，string类型

                /***************************** 以下是非必输字段 ****************************/
                //domBody[i] "issodid"] = ""; //销售订单子表ID，string类型
                //domBody[i] "idsodid"] = ""; //目标销售订单子表ID，string类型
                if (ds.Tables["Transd"].DefaultView[i]["itrids"] != DBNull.Value)
                    domBody[i]["itrids"] = ds.Tables["Transd"].DefaultView[i]["itrids"].ToString();//调拨申请单子表ID，int类型
                //domBody[i] "cbarcode"] = ""; //条形码，string类型
                //domBody[i] "cbvencode"] = ""; //供应商编码，string类型
                //domBody[i] "cinvaddcode"] = ""; //存货代码，string类型
                //domBody[i] "cinvname"] = ""; //存货名称，string类型
                //domBody[i] "cvenname"] = ""; //供应商，string类型
                if (ds.Tables["Transd"].DefaultView[i]["imassdate"] != DBNull.Value)
                    domBody[i]["imassdate"] = ds.Tables["Transd"].DefaultView[i]["imassdate"].ToString(); //保质期，int类型
                //domBody[i] "cassunit"] = ""; //库存单位码，string类型
                if (ds.Tables["Transd"].DefaultView[i]["dmadedate"] != DBNull.Value)
                    domBody[i]["dmadedate"] = ds.Tables["Transd"].DefaultView[i]["dmadedate"].ToString(); //生产日期，DateTime类型
                //domBody[i] "corufts"] = ""; //对应单据时间戳，string类型
                //domBody[i] "cinvstd"] = ""; //规格型号，string类型
                if (ds.Tables["Transd"].DefaultView[i]["cmassunit"] != DBNull.Value)
                    domBody[i]["cmassunit"] = ds.Tables["Transd"].DefaultView[i]["cmassunit"].ToString(); //保质期单位，int类型
                //domBody[i] "cdsocode"] = ""; //目标需求跟踪号，string类型
                //domBody[i] "csocode"] = ""; //需求跟踪号，string类型
                //domBody[i] "cinvm_unit"] = ""; //主计量单位，string类型
                if (ds.Tables["Transd"].DefaultView[i]["cinposname"].ToString().Trim() != string.Empty)
                    domBody[i]["cinposname"] = ds.Tables["Transd"].DefaultView[i]["cinposname"].ToString(); //调入货位，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cinposcode"].ToString().Trim() != string.Empty)
                    domBody[i]["cinposcode"] = ds.Tables["Transd"].DefaultView[i]["cinposcode"].ToString(); //调入货位编码，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["coutposname"].ToString().Trim() != string.Empty)
                    domBody[i]["coutposname"] = ds.Tables["Transd"].DefaultView[i]["coutposname"].ToString(); //调出货位，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["coutposcode"].ToString().Trim() != string.Empty)
                    domBody[i]["coutposcode"] = ds.Tables["Transd"].DefaultView[i]["coutposcode"].ToString(); //调出货位编码，string类型
                //domBody[i] "cvmivencode"] = ""; //代管商代码，string类型
                //domBody[i] "cvmivenname"] = ""; //代管商，string类型
                if (ds.Tables["Transd"].DefaultView[i]["cfree1"].ToString().Trim() != string.Empty)
                    domBody[i]["cfree1"] = ds.Tables["Transd"].DefaultView[i]["cfree1"].ToString(); //存货自由项1，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cfree3"].ToString().Trim() != string.Empty)
                    domBody[i]["cfree3"] = ds.Tables["Transd"].DefaultView[i]["cfree3"].ToString(); //存货自由项3，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cfree4"].ToString().Trim() != string.Empty)
                    domBody[i]["cfree4"] = ds.Tables["Transd"].DefaultView[i]["cfree4"].ToString(); //存货自由项4，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cfree5"].ToString().Trim() != string.Empty)
                    domBody[i]["cfree5"] = ds.Tables["Transd"].DefaultView[i]["cfree5"].ToString(); //存货自由项5，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cfree6"].ToString().Trim() != string.Empty)
                    domBody[i]["cfree6"] = ds.Tables["Transd"].DefaultView[i]["cfree6"].ToString(); //存货自由项6，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cfree7"].ToString().Trim() != string.Empty)
                    domBody[i]["cfree7"] = ds.Tables["Transd"].DefaultView[i]["cfree7"].ToString(); //存货自由项7，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cfree8"].ToString().Trim() != string.Empty)
                    domBody[i]["cfree8"] = ds.Tables["Transd"].DefaultView[i]["cfree8"].ToString(); //存货自由项8，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cfree9"].ToString().Trim() != string.Empty)
                    domBody[i]["cfree9"] = ds.Tables["Transd"].DefaultView[i]["cfree9"].ToString(); //存货自由项9，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cfree10"].ToString().Trim() != string.Empty)
                    domBody[i]["cfree10"] = ds.Tables["Transd"].DefaultView[i]["cfree10"].ToString(); //存货自由项10，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cfree2"].ToString().Trim() != string.Empty)
                    domBody[i]["cfree2"] = ds.Tables["Transd"].DefaultView[i]["cfree2"].ToString(); //存货自由项2，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["ctvbatch"].ToString().Trim() != string.Empty)
                    domBody[i]["ctvbatch"] = ds.Tables["Transd"].DefaultView[i]["ctvbatch"].ToString(); //批号，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["itvnum"] != DBNull.Value)
                    domBody[i]["itvnum"] = ds.Tables["Transd"].DefaultView[i]["itvnum"].ToString(); //件数，double类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["iinvexchrate"] != DBNull.Value)
                    domBody[i]["iinvexchrate"] = ds.Tables["Transd"].DefaultView[i]["iinvexchrate"].ToString(); //换算率，double类型
                domBody[i]["itvquantity"] = ds.Tables["Transd"].DefaultView[i]["itvquantity"] == DBNull.Value ? "0" : ds.Tables["Transd"].DefaultView[i]["itvquantity"].ToString(); //数量，double类型
                //domBody[i] "cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[i] "cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[i] "itvacost"] = ""; //单价，double类型
                //domBody[i] "csdemandmemo"] = ""; //需求分类代号说明，string类型
                //domBody[i] "cddemandmemo"] = ""; //目标需求分类代号说明，string类型
                //domBody[i] "comcode"] = ""; //委外订单号，string类型
                //domBody[i] "cmocode"] = ""; //生产订单号，string类型
                //domBody[i] "invcode"] = ""; //产品编码，string类型
                //domBody[i] "invname"] = ""; //产品，string类型
                //domBody[i] "imoseq"] = ""; //生产订单行号，string类型
                //domBody[i] "iomids"] = ""; //iomids，int类型
                //domBody[i] "imoids"] = ""; //imoids，int类型
                if (ds.Tables["Transd"].DefaultView[i]["iexpiratdatecalcu"] != DBNull.Value)
                    domBody[i]["iexpiratdatecalcu"] = ds.Tables["Transd"].DefaultView[i]["iexpiratdatecalcu"].ToString(); //有效期推算方式，int类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["cexpirationdate"].ToString().Trim() != "")
                    domBody[i]["cexpirationdate"] = ds.Tables["Transd"].DefaultView[i]["cexpirationdate"].ToString(); //有效期至，string类型
                //
                if (ds.Tables["Transd"].DefaultView[i]["dexpirationdate"] != DBNull.Value)
                    domBody[i]["dexpirationdate"] = ds.Tables["Transd"].DefaultView[i]["dexpirationdate"].ToString(); //有效期计算项，string类型
                //domBody[i] "itvaprice"] = ""; //金额，double类型
                //domBody[i] "itvpcost"] = ""; //计划单价／售价，double类型
                //domBody[i] "isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[i] "issotype"] = ""; //需求跟踪方式，int类型
                //domBody[i] "idsoseq"] = ""; //目标需求跟踪行号，string类型
                //domBody[i] "idsotype"] = ""; //目标需求跟踪方式，int类型
                domBody[i]["bcosting"] = ds.Tables["Transd"].DefaultView[i]["bcosting"].ToString();// //是否核算，string类型
                //domBody[i] "itvpprice"] = ""; //计划金额／售价金额，double类型
                //domBody[i] "cinva_unit"] = ""; //库存单位，string类型
                if (ds.Tables["Transd"].DefaultView[i]["ddisdate"] != DBNull.Value)
                    domBody[i]["ddisdate"] = ds.Tables["Transd"].DefaultView[i]["ddisdate"].ToString(); //失效日期，DateTime类型
                //domBody[i] "cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[i] "cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[i] "cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[i] "cinvdefine16"] = ""; //存货自定义项16，string类型
                if (ds.Tables["Transd"].DefaultView[i]["cposition"].ToString().Trim() != "")
                    domBody[i]["cposition"] = ds.Tables["Transd"].DefaultView[i]["cposition"].ToString(); //货位编码，string类型
                //domBody[i] "creplaceitem"] = ""; //替换件，string类型
                //domBody[i] "cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[i] "cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[i] "cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[i] "rdsid"] = ""; //对应入库单id，int类型
                if (ds.Tables["Transd"].DefaultView[i]["cdefine34"] != DBNull.Value)
                    domBody[i]["cdefine34"] = ds.Tables["Transd"].DefaultView[i]["cdefine34"].ToString(); //表体自定义项13，int类型
                //domBody[i] "cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[i] "impoids"] = ""; //生产订单子表Id，int类型
                domBody[i]["ctvcode"] = ds.Tables["Transd"].DefaultView[i]["ctvcode"].ToString();//单据号，string类型
                //domBody[i] "cinvouchcode"] = ""; //对应入库单号，string类型
                domBody[i]["cdefine22"] = ds.Tables["TransM"].DefaultView[0]["id"].ToString(); //表体自定义项1，string类型
                //domBody[i] "cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[i] "cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[i] "cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[i] "cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[i] "cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[i] "cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[i] "cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[i] "cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[i] "cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[i] "cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[i] "cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[i] "cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[i] "cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[i] "cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[i] "cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[i] "cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[i] "cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[i] "cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[i] "cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[i] "cdefine27"] = ""; //表体自定义项6，double类型
                //domBody[i] "citemcode"] = ""; //项目编码，string类型
                //domBody[i] "cname"] = ""; //项目，string类型
                //domBody[i] "citem_class"] = ""; //项目大类编码，string类型
                //domBody[i] "fsalecost"] = ""; //零售单价，double类型
                //domBody[i] "fsaleprice"] = ""; //零售金额，double类型
                //domBody[i] "citemcname"] = ""; //项目大类名称，string类型
                //domBody[i] "igrossweight"] = ""; //毛重，string类型
                //domBody[i] "inetweight"] = ""; //净重，string类型
            }
            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bUpdateNeedEas赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传true
            //broker.AssignNormalValue("bUpdateNeedEas", true);

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                string strErrMsg = "";
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strErrMsg = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strErrMsg = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strErrMsg = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strErrMsg;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                //获取out/inout参数值

                //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return "失败！" + errMsgRet;
            }

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            string sqlx = "update " + strYongYouDBName + ".dbo.transvouchs\r\n" +
                            "set id='" + ds.Tables["TransM"].DefaultView[0]["id"].ToString() + "' where id is null and ctvcode='" + ds.Tables["TransM"].DefaultView[0]["ctvcode"].ToString() + "'";

            //保存
            try
            {
                CustomizableDesignBLL.ExecSQL(sqlx);
            }
            catch (Exception ex)
            {
                return "修改调拨单成功，但是刷新id出错：" + ex.Message;
            }
            return "";
        }
        #endregion
        #region 可靠材料出库API
        public string KeKaoMaterialOutStorage(DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strPKValue)
        {
            //inventory 存货档案表  是否批次管理 bInvBatch
            //Warehouse 仓库档案    代管仓   bProxyWh 
            if (ds.Tables[0].DefaultView.Count == 0)
            {
                return "材料出库单据不能为空";
            }

            //获取仓库和仓库代码
            string strStorageName = ds.Tables[0].DefaultView[0]["StorageName"].ToString();
            string strcwhcode = "";
            string strcwhname = "";
            int iStartIndex = strStorageName.IndexOf('(');
            int iEndIndex = strStorageName.IndexOf(')');
            if (iStartIndex >= 0 && iEndIndex > 0 && iEndIndex > iStartIndex)
            {
                strcwhcode = strStorageName.Substring(iStartIndex + 1, iEndIndex - iStartIndex - 1);
                strcwhname = strStorageName.Substring(iEndIndex + 1, strStorageName.Length - iEndIndex - 1);
            }
            //
            #region 获取存货是否批次管理和仓库是否代管仓需要代管商
            string strMatrialCodeWhere = string.Empty;
            for (int iRow = 0; iRow < ds.Tables["T_TCAppOutStorageProduct"].DefaultView.Count; iRow++)
            {
                string strTCMaterialCode = ds.Tables["T_TCAppOutStorageProduct"].DefaultView[iRow]["MaterialCode"].ToString(); //材料编码，string类型
                //
                if (strMatrialCodeWhere == string.Empty)
                {
                    strMatrialCodeWhere = "'" + strTCMaterialCode + "'";
                }
                else
                {
                    strMatrialCodeWhere = strMatrialCodeWhere + ",'" + strTCMaterialCode + "'";
                }
            }
            //
            DataSet dsCKAndPC = new DataSet();
            List<DataTableName> dtnCKAndPCList = new List<DataTableName>();
            DataTableName dtnCKAndPC = new DataTableName();
            //
            dtnCKAndPC.strSelectSQL = "select cWhCode,cWhName,bProxyWh  from " + strYongYouDBName + ".dbo.Warehouse where cWhCode='" + strcwhcode + "'";
            dtnCKAndPC.strTableName = "Warehouse";
            dtnCKAndPCList.Add(dtnCKAndPC);
            //
            if (!string.IsNullOrEmpty(strMatrialCodeWhere))
                dtnCKAndPC.strSelectSQL = "select cinvcode,bInvBatch  from " + strYongYouDBName + ".dbo.inventory where cinvcode in (" + strMatrialCodeWhere + ")";
            else
                dtnCKAndPC.strSelectSQL = "select cinvcode,bInvBatch  from " + strYongYouDBName + ".dbo.inventory where 1=2 ";
            dtnCKAndPC.strTableName = "inventory";
            dtnCKAndPCList.Add(dtnCKAndPC);
            //
            try
            {
                dsCKAndPC = CustomizableDesignBLL.GetData(dtnCKAndPCList, false);
            }
            catch (Exception ex)
            {
                return "获取仓库和存货信息失败，原因：" + ex.Message;
            }
            #endregion



            string strResult = string.Empty;
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_997_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                return "登陆失败，原因：" + u8Login.ShareString;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/MaterialOut/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/MaterialOut/Add");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：11
            broker.AssignNormalValue("sVouchType", "11");

            //给BO表头参数DomHead赋值，此BO参数的业务类型为材料出库单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())


            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            DomHead[0]["ccode"] = "2018010604007"; //出库单号，string类型
            DomHead[0]["ddate"] = dtCreateDate.ToString("yyyy-MM-dd"); //出库日期，DateTime类型


            DomHead[0]["cwhname"] = strcwhname; //仓库，string类型
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型
            DomHead[0]["bmotran"] = "0"; //自动编号，string类型
            //DomHead[0]["isourcerowno"] = ""; //来源单行号，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            //DomHead[0]["hcinvdefine1"] = ""; //存货自定义项1，string类型
            //DomHead[0]["hcinvdefine2"] = ""; //存货自定义项2，string类型
            //DomHead[0]["hcinvdefine3"] = ""; //存货自定义项3，string类型
            //DomHead[0]["hcinvdefine4"] = ""; //存货自定义项3，string类型
            //DomHead[0]["hcinvdefine5"] = ""; //存货自定义项5，string类型
            //DomHead[0]["hcinvdefine6"] = ""; //存货自定义项3，string类型
            //DomHead[0]["hcinvdefine7"] = ""; //存货自定义项7，string类型
            //DomHead[0]["hcinvdefine8"] = ""; //存货自定义项8，string类型
            //DomHead[0]["hcinvdefine9"] = ""; //存货自定义项9，string类型
            //DomHead[0]["hcinvdefine10"] = ""; //存货自定义项10，string类型
            //DomHead[0]["hcinvdefine11"] = ""; //存货自定义项11，int类型
            //DomHead[0]["hcinvdefine12"] = ""; //存货自定义项12，int类型
            //DomHead[0]["hcinvdefine13"] = ""; //存货自定义项13，double类型
            //DomHead[0]["hcinvdefine14"] = ""; //存货自定义项14，double类型
            //DomHead[0]["hcinvdefine15"] = ""; //存货自定义项15，DateTime类型
            //DomHead[0]["hcinvdefine16"] = ""; //存货自定义项16，DateTime类型
            //DomHead[0]["cinvstd"] = ""; //规格型号，string类型
            //DomHead[0]["dchkdate"] = ""; //检验日期，DateTime类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["iproorderid"] = ""; //生产订单ID，string类型
            //DomHead[0]["cmpocode"] = ""; //订单号，string类型
            //DomHead[0]["cpspcode"] = ""; //产品编码，string类型
            //DomHead[0]["cproinvaddcode"] = ""; //存货代码，string类型
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            DomHead[0]["iverifystate"] = "0"; //iverifystate，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，string类型
            //DomHead[0]["imquantity"] = ""; //产量，double类型
            //DomHead[0]["cprobatch"] = ""; //生产批号，string类型
            DomHead[0]["cbustype"] = "领料"; //业务类型，int类型
            //DomHead[0]["cbuscode"] = ""; //业务号，string类型
            //DomHead[0]["cchkperson"] = ""; //检验员，string类型
            //DomHead[0]["crdname"] = ""; //出库类别，string类型
            //DomHead[0]["cdepname"] = ""; //部门，string类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["cvenabbname"] = ""; //委外商，string类型
            DomHead[0]["bomfirst"] = "0"; //bomfirst，string类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型
            //DomHead[0]["dveridate"] = ""; //审核日期，DateTime类型
            string strInorout = ds.Tables[0].DefaultView[0]["InOrOut"].ToString();
            string strcrdcode = "";
            int iCRDStartIndex = strInorout.IndexOf('(');
            int iCRDIndex = strInorout.IndexOf(')');
            if (iCRDStartIndex >= 0 && iCRDIndex > 0 && iCRDIndex > iCRDStartIndex)
            {
                strcrdcode = strInorout.Substring(iCRDStartIndex + 1, iCRDStartIndex - iCRDStartIndex - 1);
            }
            //
            DomHead[0]["crdcode"] = strcrdcode; //出库类别编码，string类型
            DomHead[0]["cmemo"] = "PDA生成"; //备注，string类型
            DomHead[0]["cmaker"] = ds.Tables[0].DefaultView[0]["CreaterName"].ToString(); ; //制单人，string类型
            //DomHead[0]["chandler"] = ""; //审核人，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["cinvname"] = ""; //产品名称，string类型
            DomHead[0]["biscomplement"] = "0"; //补料标志，int类型
            //DomHead[0]["cpersonname"] = ""; //业务员，string类型
            //DomHead[0]["bpositive"] = ""; //红蓝标识，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            DomHead[0]["csource"] = "库存"; //单据来源，int类型
            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["brdflag"] = ""; //收发标志，string类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            //DomHead[0]["cvencode"] = ""; //委外商编码，string类型
            //中间数据库表的主键
            DomHead[0]["cdefine10"] = strPKValue; //表头自定义项10，string类型
            DomHead[0]["cvouchtype"] = "11"; //单据类型，string类型


            DomHead[0]["cwhcode"] = strcwhcode; //仓库编码，string类型
            DomHead[0]["cdepcode"] = "1022"; //部门编码，string类型
            //DomHead[0]["cpersoncode"] = ""; //业务员编码，string类型
            DomHead[0]["vt_id"] = "131486"; //模版号，int类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型

            //给BO表体参数domBody赋值，此BO参数的业务类型为材料出库单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = ds.Tables["T_TCAppOutStorageProduct"].DefaultView.Count; //设置BO对象行数
            #region 细表数据
            for (int iRow = 0; iRow < ds.Tables["T_TCAppOutStorageProduct"].DefaultView.Count; iRow++)
            {
                //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
                //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
                //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = "0"; //主关键字段，int类型
                domBody[iRow]["cinvcode"] = ds.Tables["T_TCAppOutStorageProduct"].DefaultView[iRow]["MaterialCode"].ToString(); //材料编码，string类型

                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["iavaquantity"] = ""; //可用量，string类型
                //domBody[iRow]["iavanum"] = ""; //可用件数，string类型
                //domBody[iRow]["ipresent"] = ""; //现存量，string类型
                //domBody[iRow]["iinvsncount"] = ""; //序列号个数，string类型
                //domBody[iRow]["imaids"] = ""; //领料申请单子表id，string类型
                //domBody[iRow]["csourcemocode"] = ""; //源订单号，string类型
                //domBody[iRow]["isourcemodetailsid"] = ""; //源订单子表标识，string类型
                //domBody[iRow]["invstd"] = ""; //产品规格，string类型
                domBody[iRow]["cbmemo"] = "PDA生成"; //备注，string类型
                //domBody[iRow]["applycode"] = ""; //子件补料申请单号，string类型
                //domBody[iRow]["applydid"] = ""; //applydid，string类型
                domBody[iRow]["irowno"] = iRow + 1; //行号，string类型
                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["cservicecode"] = ""; //服务单号，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["coutvouchid"] = ""; //对应蓝字出库单id，string类型
                //domBody[iRow]["coutvouchtype"] = ""; //对应蓝字出库单类型，string类型
                //domBody[iRow]["isredoutquantity"] = ""; //对应蓝字出库单退回数量，string类型
                //domBody[iRow]["isredoutnum"] = ""; //对应蓝字出库单退回件数，string类型
                domBody[iRow]["ipesotype"] = "0"; //需求跟踪方式，string类型
                //domBody[iRow]["ipesodid"] = ""; //销售订单子表，string类型
                //domBody[iRow]["cpesocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["ipesoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["bsupersede"] = ""; //替代料，string类型
                //domBody[iRow]["isupersedeqty"] = ""; //替代数量，string类型
                //domBody[iRow]["isupersedempoids"] = ""; //被替代料生产订单子表id，string类型
                //domBody[iRow]["imoallocatesubid"] = ""; //替代料子表subid，string类型
                //domBody[iRow]["cinvoucherlineid"] = ""; //源单行ID，string类型
                //domBody[iRow]["cinvouchercode"] = ""; //源单号，string类型
                //domBody[iRow]["cinvouchertype"] = ""; //源单类型，string类型
                //domBody[iRow]["ipresentnum"] = ""; //现存件数，string类型
                //domBody[iRow]["cplanlotcode"] = ""; //计划批号，string类型
                //domBody[iRow]["bcanreplace"] = ""; //可替代，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型

                /***************************** 以下是非必输字段 ****************************/
                //domBody[iRow]["id"] = "1000311417"; //与主表关联项，int类型

                //domBody[iRow]["cinvaddcode"] = ""; //材料代码，string类型
                //domBody[iRow]["cinvname"] = ""; //材料名称，string类型
                //domBody[iRow]["cinvstd"] = ""; //规格型号，string类型

                domBody[iRow]["cinvm_unit"] = "只"; //inventory.cComUnitCode 主计量单位，string类型



                domBody[iRow]["cinva_unit"] = ""; //inventory.cSTComUnitCode 库存单位，string类型
                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型
                //sqg目前没有字段
                // domBody[iRow]["cposition"] = ds.Tables["T_TCAppOutStorageProduct"].DefaultView[iRow]["PostCode"].ToString(); //货位编码，string类型
                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，double类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，double类型
                //domBody[iRow]["cfree2"] = ""; //存货自由项2，string类型



                bool bInvBatch = false;
                string strTCProductCode = ds.Tables["T_TCAppOutStorageProduct"].DefaultView[iRow]["MaterialCode"].ToString();
                dsCKAndPC.Tables["inventory"].DefaultView.RowFilter = "cinvcode='" + strTCProductCode + "'";
                if (dsCKAndPC.Tables["inventory"].DefaultView.Count > 0)
                    bInvBatch = ds.Tables["inventory"].DefaultView[0]["bInvBatch"] == DBNull.Value ? false : (bool)ds.Tables["inventory"].DefaultView[0]["bInvBatch"];
                else
                {
                    return "存货" + strTCProductCode + "无法获取对应的批次设置！";
                }
                if (bInvBatch)
                    domBody[iRow]["cbatch"] = ds.Tables["T_TCAppOutStorageProduct"].DefaultView[iRow]["BtcheNo"].ToString(); //批号，string类型  sqg 必需项
                else
                    domBody[iRow]["cbatch"] = "";
                domBody[iRow]["iinvexchrate"] = "0"; //换算率，double类型
                //domBody[iRow]["inum"] = "0"; //件数，double类型
                decimal decQuantity = ds.Tables["T_TCAppOutStorageProduct"].DefaultView[iRow]["Quantity"] == DBNull.Value ? 0 : (decimal)ds.Tables["T_TCAppOutStorageProduct"].DefaultView[iRow]["Quantity"];
                domBody[iRow]["iquantity"] = Trade.DBUtility.Common.decimalEx.RoundEx(decQuantity, 2);  //数量，double类型
                //domBody[iRow]["iunitcost"] = ""; //单价，double类型
                //domBody[iRow]["iprice"] = ""; //金额，double类型
                //domBody[iRow]["ipunitcost"] = ""; //计划单价，double类型
                //domBody[iRow]["ipprice"] = ""; //计划金额，double类型
                //domBody[iRow]["dvdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["cobjcode"] = ""; //成本对象编码，string类型
                //domBody[iRow]["cname"] = ""; //项目，string类型
                //domBody[iRow]["isoutquantity"] = ""; //累计出库数量，double类型
                //domBody[iRow]["isoutnum"] = ""; //累计出库件数，double类型
                //domBody[iRow]["dsdate"] = ""; //结算日期，DateTime类型
                //domBody[iRow]["ifquantity"] = ""; //实际数量，double类型
                //domBody[iRow]["ifnum"] = ""; //实际件数，double类型
                //domBody[iRow]["cvouchcode"] = ""; //对应入库单id，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，double类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，double类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，double类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cbatchproperty8"] = ""; //批次属性8，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，DateTime类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型
                //domBody[iRow]["inquantity"] = ""; //应发数量，double类型
                //domBody[iRow]["innum"] = ""; //应发件数，double类型
                //domBody[iRow]["dmadedate"] = ""; //生产日期，DateTime类型
                //domBody[iRow]["impoids"] = ""; //生产订单子表ID，int类型
                //domBody[iRow]["isodid"] = ""; //销售订单子表ID，string类型
                //domBody[iRow]["iomomid"] = ""; //委外用料表ID，int类型
                //domBody[iRow]["iomodid"] = ""; //委外订单子表ID，int类型
                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //domBody[iRow]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                //domBody[iRow]["cposname"] = ""; //货位，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["cmolotcode"] = ""; //生产批号，string类型
                //domBody[iRow]["dmsdate"] = ""; //核销日期，DateTime类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["cmocode"] = ""; //生产订单号，string类型
                //domBody[iRow]["comcode"] = ""; //委外订单号，string类型

                //bool bProxyWh = false;

                //dsCKAndPC.Tables["Warehouse"].DefaultView.RowFilter = "cinvcode='" + strcwhcode + "'";
                //if (dsCKAndPC.Tables["Warehouse"].DefaultView.Count > 0)
                //    bProxyWh = ds.Tables["Warehouse"].DefaultView[0]["bProxyWh"] == DBNull.Value ? false : (bool)ds.Tables["Warehouse"].DefaultView[0]["bProxyWh"];
                //else
                //{
                //    return "仓库" + strTCProductCode + "无法获取代管商设置！";
                //}
                //if (bProxyWh)
                //    domBody[iRow]["cvmivencode"] = ds.Tables["T_TCAppOutStorageProduct"].DefaultView[iRow]["cvmivencode"].ToString(); //代管商代码，string类型 sqg  必需项
                //else
                //    domBody[iRow]["cvmivencode"] = "";


                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型
                //domBody[iRow]["bvmiused"] = ""; //代管消耗标识，int类型
                //domBody[iRow]["ivmisettlequantity"] = ""; //代管挂账确认单数量，double类型
                //domBody[iRow]["ivmisettlenum"] = ""; //代管挂账确认单件数，double类型ssssssssss
                //domBody[iRow]["productinids"] = ""; //productinids，int类型
                //domBody[iRow]["crejectcode"] = ""; //在库不良品处理单号，string类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型
                //domBody[iRow]["iordertype"] = ""; //销售订单类别，int类型
                //domBody[iRow]["iorderdid"] = ""; //iorderdid，int类型
                //domBody[iRow]["iordercode"] = ""; //销售订单号，string类型
                //domBody[iRow]["iorderseq"] = ""; //销售订单行号，string类型
                domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，string类型
                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["ibondedsumqty"] = ""; //累计保税处理抽取数量，string类型
                //domBody[iRow]["copdesc"] = ""; //工序说明，string类型
                //domBody[iRow]["cmworkcentercode"] = ""; //工作中心编码，string类型
                //domBody[iRow]["cmworkcenter"] = ""; //工作中心，string类型
                //domBody[iRow]["invcode"] = ""; //产品编码，string类型
                //domBody[iRow]["invname"] = ""; //产品，string类型
                //domBody[iRow]["cwhpersonname"] = ""; //库管员名称，string类型
                //domBody[iRow]["cbaccounter"] = ""; //记账人，string类型
                //domBody[iRow]["bcosting"] = ""; //是否核算，string类型
                //domBody[iRow]["isotype"] = ""; //需求跟踪方式，int类型
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["imoseq"] = ""; //生产订单行号，string类型
                //domBody[iRow]["iopseq"] = ""; //工序行号，string类型
                //domBody[iRow]["isquantity"] = ""; //累计核销数量，double类型
                //domBody[iRow]["ismaterialfee"] = ""; //累计核销金额，double类型
                domBody[iRow]["cdefine34"] = ds.Tables["T_TCAppOutStorageProduct"].DefaultView[iRow]["SerialID"].ToString(); //表体自定义项3，string类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["cwhpersoncode"] = ""; //库管员编码，string类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["itrids"] = ""; //特殊单据子表标识，double类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //表体自定义项6，double类型
                //domBody[iRow]["citemcode"] = ""; //项目编码，string类型
                //domBody[iRow]["citem_class"] = ""; //项目大类编码，string类型
                //domBody[iRow]["citemcname"] = ""; //项目大类名称，string类型
            }
            #endregion
            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        //结束本次调用，释放API资源
                        broker.Release();
                        return "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        //结束本次调用，释放API资源
                        broker.Release();
                        return "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    //结束本次调用，释放API资源
                    broker.Release();
                    if (exReason.Length != 0)
                    {
                        return "异常原因：" + exReason;
                    }
                }
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return "失败！" + errMsgRet;
            }
            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return strResult;
        }
        #endregion
        #region 可靠采购订单生成到货单API
        /// <summary>
        /// 采购订单生成到货单API
        /// </summary>
        /// <param name="strYongYouDBName">UFDATA_999_2014</param>
        /// <param name="sAccID">999</param>
        /// <param name="sYear">2017</param>
        /// <param name="sUserID">demo</param>
        /// <param name="sPassword">demo</param>
        /// <param name="sDate">2017-08-19</param>
        /// <param name="sServer">127.0.0.1</param>
        /// <param name="strSHOrderNum">送货单号</param>
        /// <returns></returns>
        public string KeKaoDHD(DataSet dsSHOrder, DataSet dsPDACGDH, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strPDASerialNum, List<string> listProdcutCode, out DataTable dtSHFBIDAndQty)
        {
            dtSHFBIDAndQty = null;
            //string strYongYouDBName = "UFDATA_999_2014";
            //string sAccID = "999";
            //string sYear = "2015";
            //string sUserID = "demo";
            //string sPassword = "";
            //string sDate = "2015-02-01";
            //string sServer = "127.0.0.1";
            //string strSHOrderNum = this.tbSHOrderNum.Text;//"201708210001";
            //string strcwhcode = "";
            //string strcwhname = "";
            ////
            //string strRet = this.DHD(strYongYouDBName, sAccID, sYear, sUserID, sPassword, sDate, sServer, strSHOrderNum, strcwhcode, strcwhname);
            //MessageBox.Show(strRet, "完成");

            //判断是否已经搞过了
            string strISExists = "SELECT * FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch where isnull(cDefine10,'')='" + strPDASerialNum + "'";
            DataSet dsISExists = new DataSet();
            try
            {
                dsISExists = CustomizableDesignBLL.GetData(strISExists);
            }
            catch (Exception ex)
            {
                return "判断送货单号已经做过到货单，出错：" + ex.Message;
            }
            if (dsISExists != null && dsISExists.Tables[0].DefaultView.Count > 0)
            {
                return "采购到货单号已经做过到货单";
            }
            //long lMaxCode = 0;
            //string strMAXCode = "select max(cCode) cCode FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch where ISNUMERIC(cCode)=1";
            //DataSet dsMaxCode = new DataSet();
            //try
            //{
            //    dsMaxCode = CustomizableDesignBLL.GetData(strMAXCode);
            //    if (dsMaxCode.Tables[0].DefaultView.Count > 0)
            //    {
            //        lMaxCode = Convert.ToInt64(dsMaxCode.Tables[0].DefaultView[0]["cCode"].ToString());
            //    }
            //}
            //catch(Exception ex)
            //{
            //    return "获取最大的到货单号出错：" + ex.Message;
            //}
            //strPath = "1";
            //lMaxCode++;
            //string strNewccode = lMaxCode.ToString("0000000000");//好像随便一个单号都可以的

            string strNewccode = "0000000001";//好像随便一个单号都可以的
            string strMAXCode = "select top 1 cCode FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch order by dDate";
            DataSet dsMaxCode = new DataSet();
            try
            {
                dsMaxCode = CustomizableDesignBLL.GetData(strMAXCode);
                if (dsMaxCode.Tables[0].DefaultView.Count > 0)
                {
                    strNewccode = dsMaxCode.Tables[0].DefaultView[0]["cCode"].ToString();
                }
            }
            catch (Exception ex)
            {
                return "获取最大的到货单号出错：" + ex.Message;
            }
            int ID = 0;// 1000000021;
            int iAutoID = 0;// 1000000034;
            dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Sort = "SortID";
            #region 创建一个真正分配数量的库存表
            DataTable dtRealFBKC = new DataTable();
            dtRealFBKC.Columns.Add(new DataColumn("ID", typeof(string)));
            dtRealFBKC.Columns.Add(new DataColumn("SerialID", typeof(string)));
            dtRealFBKC.Columns.Add(new DataColumn("Quantity", typeof(decimal)));
            #endregion
            #region 这里根据库存数据分配送货单里面的ID和明细
            DataTable dtKC = dsSHOrder.Tables["T_CGDHQtyFHKC"].DefaultView.ToTable();
            //
            dtKC.DefaultView.Sort = "";
            foreach (string strProductCodeItem in listProdcutCode)
            {
                dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.RowFilter = "ProductCode='" + strProductCodeItem + "'";
                dtKC.DefaultView.RowFilter = "ProductCode='" + strProductCodeItem + "'";
                if (dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count == 0)
                {
                    return "送货单号中不存在存货" + strProductCodeItem;
                }
                //循环产品，然后依次减少数量，最后到当前单据的时候开始真正分配数量
                for (int i = 0; i < dtKC.DefaultView.Count; i++)
                {
                    //
                    string strKCPDASerialNum = dtKC.DefaultView[i]["PDASerialNum"].ToString();
                    decimal decKCQuantity = dtKC.DefaultView[i]["Quantity"] == DBNull.Value ? 0 : (decimal)dtKC.DefaultView[i]["Quantity"];
                    //
                    for (int iSH = 0; iSH < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; iSH++)
                    {
                        decimal decSHQuantity = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iSH]["Quantity"] == DBNull.Value ? 0 : (decimal)dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iSH]["Quantity"];
                        string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iSH]["ID"].ToString();
                        string strSerialID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iSH]["SerialID"].ToString();
                        //
                        if (decSHQuantity == 0)
                            continue;
                        if (decSHQuantity - decKCQuantity > 0)
                        {
                            decSHQuantity = decSHQuantity - decKCQuantity;
                            //
                            dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iSH]["Quantity"] = decSHQuantity;
                            dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iSH].EndEdit();
                            //当前单号分配数量
                            if (strKCPDASerialNum == strPDASerialNum)
                            {
                                DataRow drnew = dtRealFBKC.NewRow();
                                drnew["ID"] = strID;
                                drnew["SerialID"] = strSerialID;
                                drnew["Quantity"] = decKCQuantity;
                                drnew.EndEdit();
                                //
                                dtRealFBKC.Rows.Add(drnew);
                            }
                            break;
                        }
                        else
                        {
                            decimal decBenCIQuantity = decSHQuantity - decKCQuantity;
                            //
                            dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iSH]["Quantity"] = 0;
                            dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iSH].EndEdit();
                            //
                            //当前单号分配数量
                            if (strKCPDASerialNum == strPDASerialNum)
                            {
                                DataRow drnew = dtRealFBKC.NewRow();
                                drnew["ID"] = strID;
                                drnew["SerialID"] = strSerialID;
                                drnew["Quantity"] = decSHQuantity;
                                drnew.EndEdit();
                                //
                                dtRealFBKC.Rows.Add(drnew);
                            }
                        }
                    }
                    //
                }
            }
            #endregion
            if (dtRealFBKC.DefaultView.Count == 0)
            {
                return "当前送货单单据已经生成到货单，不能超额到货！";
            }
            string strDetailWhere = "";
            for (int i = 0; i < dtRealFBKC.DefaultView.Count; i++)
            {
                string strID = dtRealFBKC.DefaultView[i]["ID"].ToString();
                if (strID == string.Empty)
                    continue;
                if (strDetailWhere == "")
                    strDetailWhere = strID;
                else
                    strDetailWhere = strDetailWhere + " , " + strID;
            }
            if (strDetailWhere == "")
            {
                return "送货单分配数量明细ID为空！";
            }
            //
            DataSet dsStock = new DataSet();
            List<DataTableName> dtnList = new List<DataTableName>();
            DataTableName dtn = new DataTableName();
            dtn.strSelectSQL = "select PO_Pomain.cPOID ,\r\n" +
                               " CONVERT(VARCHAR(20), PO_Pomain.cmaketime, 23) 创建日期 ,\r\n" +
                               " PO_Podetails.iTax 税额 ,\r\n" +
                               " PO_Pomain.POID ,\r\n" +
                               " PO_Pomain.cBusType ,\r\n" +
                               " PO_Pomain.csccode ,\r\n" +
                               " PO_Pomain.cexch_name ,\r\n" +
                               " PO_Pomain.itaxrate ,\r\n" +
                               " PO_Pomain.nflat ,\r\n" +
                               " PO_Pomain.iflowid ,\r\n" +
                               " PurchaseType.cPTName ,\r\n" +
                               " PO_Podetails.ID DetailID ,\r\n" +
                               " hr_hi_person.cPsn_Name ,\r\n" +
                               " PO_Pomain.cVenCode 供应商编码 ,\r\n" +
                               " PO_Pomain.cdepcode,\r\n" +
                               " PO_Pomain.cptcode,\r\n" +
                               " PO_Pomain.cpersoncode,\r\n" +
                               " Department.cDepName 部门名称 ,\r\n" +
                               " vendor.cVenName 供应商名称 ,\r\n" +
                               " PO_Podetails.cInvCode 货号 ,\r\n" +
                               " inventory.cInvName 品名 ,\r\n" +
                               " inventory.cInvStd 规格 ,\r\n" +
                               " inventory.cInvCCode ,\r\n" +
                               " PO_Podetails.iQuantity 数量 ,\r\n" +
                               " PO_Podetails.iUnitPrice 不含税单价,\r\n" +
                               " PO_Podetails.iTaxPrice 含税单价,\r\n" +
                               " PO_Podetails.iPerTaxRate 税额,\r\n" +
                               " PO_Podetails.iNum 件数 ,\r\n" +
                               " PO_Podetails.iPerTaxRate,\r\n" +
                               " PO_Podetails.btaxcost,\r\n" +
                               " PO_Podetails.bgsp,\r\n" +
                               " ComputationUnit.cComUnitname 主单位 ,\r\n" +
                               " ComputationUnits.ichangrate,\r\n" +
                               " ComputationUnits.cComUnitname 辅计量单位 ,\r\n" +
                               " Inventory.cDefWareHouse 仓库编码 ,\r\n" +
                               " Inventory.cInvDefine1,\r\n" +
                               " (SELECT cWhCode\r\n" +
                               "  from  " + strYongYouDBName + ".dbo.WareHouse\r\n" +
                                "  WHERE (cWhCode=Warehouse.cWhCode)  \r\n" +
                               " AND (case when ISNULL(dWhEndDate,'')='' then '9999-12-31' else dWhEndDate end) >  GETDATE()\r\n" +
                               " AND Warehouse.bProxyWh=0 \r\n" +
                               " and warehouse.bWhAsset<>1  \r\n" +
                               "  AND (bBondedWh = (select top 1 isnull(bbondedinv,0) \r\n" +
                               "  from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode) or \r\n" +
                               "  (select top 1 isnull(bbondedinv,0) \r\n" +
                                " from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode)='1'))  Warehouse_cWhCode ,\r\n" +
                               " (SELECT cWhName\r\n" +
                               "  from  " + strYongYouDBName + ".dbo.WareHouse\r\n" +
                                "  WHERE (cWhCode=Warehouse.cWhCode)  \r\n" +
                               " AND (case when ISNULL(dWhEndDate,'')='' then '9999-12-31' else dWhEndDate end) >  GETDATE()\r\n" +
                               " AND Warehouse.bProxyWh=0 \r\n" +
                               " and warehouse.bWhAsset<>1  \r\n" +
                               "  AND (bBondedWh = (select top 1 isnull(bbondedinv,0) \r\n" +
                               "  from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode) or \r\n" +
                               "  (select top 1 isnull(bbondedinv,0) \r\n" +
                                " from  " + strYongYouDBName + ".dbo.inventory_sub where cinvsubcode=Inventory.cInvCode)='1')) Warehouse_cWhName,\r\n" +
                               " PO_Podetails.cFree2 公差 \r\n" +
                               " FROM " + strYongYouDBName + ".dbo.PO_Pomain PO_Pomain\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.PO_Podetails PO_Podetails ON PO_Pomain.POID = PO_Podetails.POID\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.vendor vendor ON PO_Pomain.cVenCode = vendor.cVenCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.Department Department ON PO_Pomain.cDepCode = Department.cDepCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.PurchaseType PurchaseType ON PO_Pomain.cptcode = PurchaseType.cptcode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.Inventory Inventory ON PO_Podetails.cInvCode = Inventory.cInvCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.ComputationUnit ComputationUnit ON Inventory.cComUnitCode = ComputationUnit.cComUnitCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.ComputationUnit ComputationUnits ON Inventory.cSAComUnitCode = ComputationUnits.cComUnitCode\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.hr_hi_person hr_hi_person ON PO_Pomain.cPersonCode = hr_hi_person.cPsn_Num\r\n" +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.Warehouse Warehouse ON Inventory.cDefWareHouse = Warehouse.cWhCode\r\n" +
                                " where PO_Podetails.ID in (" + strDetailWhere + ")";
            dtn.strTableName = "table_1";
            dtnList.Add(dtn);
            try
            {
                dsStock = CustomizableDesignBLL.GetData(dtnList, false);
            }
            catch (Exception ex)
            {
                return "取采购订单的数据出错：" + ex.Message;
            }
            for (int i = 0; i < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; i++)
            {
                if (dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["ID"] == DBNull.Value)
                {
                    return "T_SHOrderProduct第" + (i + 1).ToString() + "行相对应的采购订单ID为空！";
                }
                string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["ID"].ToString();
                if (dsStock.Tables[0].Select("DetailID='" + strID + "'").Length == 0)
                {
                    return "第" + (i + 1).ToString() + "行相对应的采购订单不存在！";
                }
            }
            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //采购所有接口均支持内部独立事务和外部事务，默认内部事务
            //如果是外部事务，则需要传递ADO.Connection对象，并将IsIndependenceTransaction属性设置为false
            //envContext.BizDbConnection = new ADO.Connection();
            //envContext.IsIndependenceTransaction = false;

            //设置上下文参数
            envContext.SetApiContext("VoucherType", 2); //上下文数据类型：int，含义：单据类型， 采购到货单 2 
            envContext.SetApiContext("bPositive", true); //上下文数据类型：bool，含义：红蓝标识：True,蓝字；False,红字
            envContext.SetApiContext("sBillType", "0"); //上下文数据类型：string，含义：到货单类型， 到货单 0 退货单 1
            envContext.SetApiContext("sBusType", dsStock.Tables[0].DefaultView[0]["cBusType"].ToString()); //cqz "普通采购" //上下文数据类型：string，含义：业务类型：普通采购,直运采购,受托代销

            //第三步：设置API地址标识(Url)
            //当前API：新增或修改的地址标识为：U8API/ArrivedGoods/VoucherSave
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ArrivedGoods/VoucherSave");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值
            //给BO表头参数DomHead赋值，此BO参数的业务类型为到货单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = ID; //主关键字段，int类型
            DomHead[0]["cbustype"] = dsStock.Tables[0].DefaultView[0]["cBusType"].ToString(); //业务类型，int类型
            DomHead[0]["ccode"] = strNewccode; //单据号，string类型
            DateTime ddate = DateTime.Now;
            DomHead[0]["ddate"] = ddate.ToString("yyyy-MM-dd"); //日期，DateTime类型
            DomHead[0]["cvenabbname"] = dsStock.Tables[0].DefaultView[0]["供应商名称"].ToString(); //供应商，string类型 
            DomHead[0]["cdepname"] = dsStock.Tables[0].DefaultView[0]["部门名称"].ToString();  //部门，string类型 
            DomHead[0]["cexch_name"] = dsStock.Tables[0].DefaultView[0]["cexch_name"].ToString();  //币种，string类型
            decimal iexchrate = 0;
            if (dsStock.Tables[0].DefaultView[0]["nflat"] != DBNull.Value)
            {
                iexchrate = Convert.ToDecimal(dsStock.Tables[0].DefaultView[0]["nflat"].ToString()); //汇率，double类型
            }
            DomHead[0]["iexchrate"] = iexchrate; //汇率，double类型
            //DomHead[0]["cflowname"] = ""; //流程模式描述，string类型
            //DomHead[0]["cchanger"] = ""; //变更人，string类型
            if (dsStock.Tables[0].DefaultView[0]["iflowid"] != DBNull.Value)
                DomHead[0]["iflowid"] = dsStock.Tables[0].DefaultView[0]["iflowid"].ToString(); //cqz 流程ID，string类型
            DomHead[0]["cpocode"] = dsStock.Tables[0].DefaultView[0]["cPOID"].ToString(); //单号，string类型
            //DomHead[0]["csysbarcode"] = ds.Tables["PU_ArrivalVouch"].DefaultView[0]["csysbarcode"].ToString();  //单据条码，string类型 cqz
            //DomHead[0]["csysbarcodepo"] = ""; //来源条形码，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            DateTime dtNow = DateTime.Now;
            DomHead[0]["cmaketime"] = dtNow.ToString("yyyy-MM-dd"); //制单时间，DateTime类型
            DomHead[0]["cmodifytime"] = dtNow.ToString("yyyy-MM-dd"); //修改时间，DateTime类型
            DomHead[0]["cmodifydate"] = dtNow.ToString("yyyy-MM-dd"); //修改日期，DateTime类型
            DomHead[0]["creviser"] = sUserID; //修改人，string类型
            //DomHead[0]["caudittime"] = ""; //审核时间，DateTime类型
            //DomHead[0]["cauditdate"] = ""; //审核日期，DateTime类型
            DomHead[0]["cptname"] = dsStock.Tables[0].DefaultView[0]["cPTName"].ToString(); //采购类型，string类型 
            //DomHead[0]["ccloser"] = ""; //关闭人，string类型
            DomHead[0]["iverifystateex"] = "0"; //审核状态，string类型
            //DomHead[0]["ireturncount"] = ""; //打回次数，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //是否启用工作流，string类型
            DomHead[0]["cpersonname"] = dsStock.Tables[0].DefaultView[0]["cPsn_Name"].ToString(); //业 务 员，string类型
            //DomHead[0]["cscname"] = dsStock.Tables[0].DefaultView[0]["pu_ArrHead_cscname"].ToString(); //cqz 运输方式，string类型
            decimal itaxrate = 0;
            if (dsStock.Tables[0].DefaultView[0]["itaxrate"] != DBNull.Value)
            {
                itaxrate = Convert.ToDecimal(dsStock.Tables[0].DefaultView[0]["itaxrate"].ToString()); //汇率，double类型
            }
            DomHead[0]["itaxrate"] = itaxrate.ToString(); //税率，double类型
            //DomHead[0]["cmemo"] = dsStock.Tables[0].DefaultView[0]["cmemo"].ToString(); //备注，string类型
            DomHead[0]["cmaker"] = dsPDACGDH.Tables[0].DefaultView[0]["CreaterName"].ToString(); ; //制单人，string类型
            DomHead[0]["ivtid"] = "8169"; //单据模版号，int类型
            //DomHead[0]["cverifier"] = ""; //审核人，string类型
            DomHead[0]["bnegative"] = "0"; //负发票标志，string类型
            DomHead[0]["cvencode"] = dsStock.Tables[0].DefaultView[0]["供应商编码"].ToString(); //供货单位编号，string类型
            DomHead[0]["cdepcode"] = dsStock.Tables[0].DefaultView[0]["cdepcode"].ToString(); //部门编号，string类型
            DomHead[0]["cptcode"] = dsStock.Tables[0].DefaultView[0]["cptcode"].ToString(); //采购类型编码，string类型
            //DomHead[0]["cpaycode"] = ""; //付款条件编码，string类型
            DomHead[0]["cpersoncode"] = dsStock.Tables[0].DefaultView[0]["cpersoncode"].ToString(); //职员编号，string类型
            DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["cpayname"] = ""; //付款条件，string类型
            DomHead[0]["csccode"] = dsStock.Tables[0].DefaultView[0]["csccode"].ToString();//运输方式编码，string类型
            //DomHead[0]["cdefine1"] = dsStock.Tables[0].DefaultView[0]["cdefine1"].ToString();//cqz 表头自定义项1，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            DomHead[0]["cdefine10"] = strPDASerialNum; //表头自定义项10，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["cvendefine1"] = ""; //供应商自定义项1，string类型
            //DomHead[0]["cvendefine2"] = ""; //供应商自定义项2，string类型
            //DomHead[0]["cvendefine3"] = ""; //供应商自定义项3，string类型
            //DomHead[0]["cvendefine4"] = ""; //供应商自定义项4，string类型
            //DomHead[0]["cvendefine5"] = ""; //供应商自定义项5，string类型
            //DomHead[0]["cvendefine6"] = ""; //供应商自定义项6，string类型
            //DomHead[0]["cvendefine7"] = ""; //供应商自定义项7，string类型
            //DomHead[0]["cvendefine8"] = ""; //供应商自定义项8，string类型
            //DomHead[0]["cvendefine9"] = ""; //供应商自定义项9，string类型
            //DomHead[0]["cvendefine10"] = ""; //供应商自定义项10，string类型
            //DomHead[0]["cvendefine11"] = ""; //供应商自定义项11，string类型
            //DomHead[0]["cvendefine12"] = ""; //供应商自定义项12，string类型
            //DomHead[0]["cvendefine13"] = ""; //供应商自定义项13，string类型
            //DomHead[0]["cvendefine14"] = ""; //供应商自定义项14，string类型
            //DomHead[0]["cvendefine15"] = ""; //供应商自定义项15，string类型
            //DomHead[0]["cvendefine16"] = ""; //供应商自定义项16，string类型
            DomHead[0]["idiscounttaxtype"] = "0"; //扣税类别，int类型
            DomHead[0]["ibilltype"] = "0"; //单据类型，int类型
            //DomHead[0]["cvenpuomprotocol"] = ""; //收付款协议编码，string类型
            //DomHead[0]["cvenpuomprotocolname"] = ""; //收付款协议名称，string类型

            //给BO表体参数domBody赋值，此BO参数的业务类型为到货单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = dsStock.Tables[0].DefaultView.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            for (int iRow = 0; iRow < dtRealFBKC.DefaultView.Count; iRow++)
            {
                string strID = dtRealFBKC.DefaultView[iRow]["ID"].ToString();
                DataRow[] drSelectRowsStock = dsStock.Tables[0].Select("DetailID='" + strID + "'");
                DataRow[] drSelectRowsSHOrderProduct = dsSHOrder.Tables["T_SHOrderProduct"].Select("ID='" + strID + "'");
                if (drSelectRowsStock.Length == 0)
                    continue;
                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = iAutoID + 1; //主关键字段，int类型
                domBody[iRow]["cinvcode"] = drSelectRowsStock[0]["货号"].ToString(); //存货编码，string类型
                //
                decimal iquantity = 0;
                if (dtRealFBKC.DefaultView[iRow]["Quantity"] != DBNull.Value)
                {
                    iquantity = Convert.ToDecimal(dtRealFBKC.DefaultView[iRow]["Quantity"].ToString());
                }
                domBody[iRow]["iquantity"] = iquantity.ToString(); //主计量数量，double类型
                //
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                domBody[iRow]["ivouchrowno"] = (iRow + 1).ToString(); //行号，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，string类型
                //domBody[iRow]["cbmemo"] = drSelectRowsStock[0]["cbmemo"].ToString(); //cqz 备注，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型 cqz
                //domBody[iRow]["carrivalcode"] = ""; //到货单号，string类型
                //domBody[iRow]["irejectautoid"] = ""; //irejectautoid，string类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，string类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，string类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，string类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型
                //可靠不要了， 取消掉
                //if (drSelectRowsStock[0]["cInvCCode"].ToString() == "030102" || drSelectRowsStock[0]["cInvCCode"].ToString() == "030202")
                //{
                //    domBody[iRow]["cbatchproperty8"] = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[iRow]["LuNo"].ToString(); //炉号的值  批次属性8，string类型
                //}
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，string类型
                //domBody[iRow]["isourcemocode"] = ""; //源订单号，string类型
                //domBody[iRow]["isourcemodetailsid"] = ""; //源订单子表ID，string类型
                //domBody[iRow]["freworkquantity"] = ""; //返工数量，string类型
                //domBody[iRow]["freworknum"] = ""; //返工件数，string类型
                //domBody[iRow]["iproducttype"] = "0"; //cqz产出品类型，string类型
                //domBody[iRow]["cmaininvcode"] = ""; //主产品存货编码，string类型
                //domBody[iRow]["imainmodetailsid"] = ""; //主产品订单子表ID，string类型
                //domBody[iRow]["planlotnumber"] = ""; //计划批号，string类型
                domBody[iRow]["bgift"] = "0"; //赠品，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型

                /***************************** 以下是非必输字段 ****************************/
                domBody[iRow]["cinvstd"] = drSelectRowsStock[0]["规格"].ToString(); //规格型号，string类型
                //
                decimal iinvexchrate = 0;
                if (drSelectRowsStock[0]["ichangrate"] != DBNull.Value)
                {
                    iinvexchrate = Convert.ToDecimal(drSelectRowsStock[0]["ichangrate"].ToString());
                }
                domBody[iRow]["iinvexchrate"] = iinvexchrate.ToString(); //换算率，double类型
                //
                decimal inum = 0;
                if (iinvexchrate != 0)
                {
                    inum = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity / iinvexchrate, 2);
                }
                domBody[iRow]["inum"] = inum.ToString(); //件数，double类型
                //
                itaxrate = 0;
                if (drSelectRowsStock[0]["iPerTaxRate"] != DBNull.Value)
                {
                    itaxrate = Convert.ToDecimal(drSelectRowsStock[0]["iPerTaxRate"].ToString());
                }
                domBody[iRow]["itaxrate"] = itaxrate.ToString(); //税率，double类型
                //
                decimal ioricost = 0;
                if (drSelectRowsStock[0]["不含税单价"] != DBNull.Value)
                {
                    ioricost = Convert.ToDecimal(drSelectRowsStock[0]["不含税单价"].ToString());
                }
                domBody[iRow]["ioricost"] = ioricost.ToString(); //原币单价，double类型
                //
                decimal iorimoney = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity * ioricost, 2);
                domBody[iRow]["iorimoney"] = iorimoney.ToString(); //原币金额，double类型
                //
                decimal ioritaxprice = Trade.DBUtility.Common.decimalEx.RoundEx(iorimoney * itaxrate / 100, 2);
                domBody[iRow]["ioritaxprice"] = ioritaxprice.ToString(); //原币税额，double类型
                //
                decimal icost = 0;
                if (drSelectRowsStock[0]["不含税单价"] != DBNull.Value)
                {
                    icost = Convert.ToDecimal(drSelectRowsStock[0]["不含税单价"].ToString());
                }
                domBody[iRow]["icost"] = icost.ToString(); //本币单价，double类型
                //
                decimal imoney = Trade.DBUtility.Common.decimalEx.RoundEx(iquantity * icost, 2);
                domBody[iRow]["imoney"] = imoney.ToString(); //本币金额，double类型
                //
                decimal itaxprice = Trade.DBUtility.Common.decimalEx.RoundEx(imoney * itaxrate / 100, 2);
                domBody[iRow]["itaxprice"] = itaxprice.ToString(); //本币税额，double类型
                //
                decimal isum = imoney + itaxprice;
                domBody[iRow]["isum"] = isum.ToString(); //本币价税合计，double类型
                //
                //domBody[iRow]["cinvdefine1"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine1"].ToString(); //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine4"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine4"].ToString();  //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine5"].ToString();  //存货自定义项5，string类型
                //domBody[iRow]["cfree1"] = drSelectRowsStock[0]["cfree1"].ToString(); //自由项1，string类型
                //domBody[iRow]["cinvdefine6"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine6"].ToString(); //存货自定义项6，string类型
                domBody[iRow]["cfree2"] = drSelectRowsStock[0]["公差"].ToString();//自由项2，string类型
                //domBody[iRow]["cinvdefine7"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine7"].ToString(); //存货自定义项7，string类型
                decimal iorisum = iorimoney + ioritaxprice;
                domBody[iRow]["iorisum"] = iorisum.ToString(); //原币价税合计，double类型
                //domBody[iRow]["cinvdefine8"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine8"].ToString(); //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine9"].ToString();//存货自定义项9，string类型
                //domBody[iRow]["cdefine22"] = drSelectRowsStock[0]["cdefine22"].ToString();//表体自定义项1，string类型
                //domBody[iRow]["cinvdefine10"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine10"].ToString(); //存货自定义项10，string类型
                //domBody[iRow]["cdefine23"] = drSelectRowsStock[0]["cdefine23"].ToString();//表体自定义项2，string类型
                //domBody[iRow]["cinvdefine11"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine11"].ToString(); //存货自定义项11，string类型
                //domBody[iRow]["cdefine24"] = drSelectRowsStock[0]["cdefine24"].ToString(); //表体自定义项3，string类型
                //domBody[iRow]["cinvdefine12"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine12"].ToString(); //存货自定义项12，string类型
                //domBody[iRow]["cdefine25"] = drSelectRowsStock[0]["cdefine25"].ToString(); //表体自定义项4，string类型
                //domBody[iRow]["cinvdefine13"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine13"].ToString(); //存货自定义项13，string类型
                //
                //decimal cdefine26 = 0;
                //if (drSelectRowsStock[0]["cdefine26"] != DBNull.Value)
                //{
                //    cdefine26 = Convert.ToDecimal(drSelectRowsStock[0]["cdefine26"].ToString());
                //}
                //domBody[iRow]["cdefine26"] = cdefine26.ToString(); //表体自定义项5，double类型
                ////
                //domBody[iRow]["cinvdefine14"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine14"].ToString(); //存货自定义项14，string类型
                ////
                //decimal cdefine27 = 0;
                //if (drSelectRowsStock[0]["cdefine27"] != DBNull.Value)
                //{
                //    cdefine27 = Convert.ToDecimal(drSelectRowsStock[0]["cdefine27"].ToString());
                //}
                //domBody[iRow]["cdefine27"] = cdefine27.ToString(); //表体自定义项6，double类型
                ////
                //domBody[iRow]["cinvdefine15"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine15"].ToString(); //存货自定义项15，string类型

                ////
                //domBody[iRow]["cinvdefine16"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine16"].ToString(); //存货自定义项16，string类型
                //domBody[iRow]["citemcode"] = drSelectRowsStock[0]["citemcode"].ToString();//项目编码，string类型
                //domBody[iRow]["cinvdefine2"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine3"].ToString(); //存货自定义项2，string类型
                //domBody[iRow]["citem_class"] = drSelectRowsStock[0]["citem_class"].ToString();//项目大类编码，string类型
                //domBody[iRow]["cinvdefine3"] = drSelectRowsStock[0]["pu_ArrBody_cinvdefine3"].ToString(); //存货自定义项3，string类型
                //
                domBody[iRow]["iposid"] = strID; //订单子表ID，int类型
                //
                //domBody[iRow]["citemname"] = drSelectRowsStock[0]["citemname"].ToString();//项目名称，string类型
                //domBody[iRow]["citem_name"] = drSelectRowsStock[0]["pu_ArrBody_citem_name"].ToString(); //项目大类名称，string类型
                //domBody[iRow]["cfree3"] = drSelectRowsStock[0]["cfree3"].ToString();  //自由项3，string类型
                //domBody[iRow]["cfree4"] = drSelectRowsStock[0]["cfree4"].ToString();  //自由项4，string类型
                //domBody[iRow]["cfree5"] = drSelectRowsStock[0]["cfree5"].ToString();  //自由项5，string类型
                //domBody[iRow]["cfree6"] = drSelectRowsStock[0]["cfree6"].ToString();  //自由项6，string类型
                //domBody[iRow]["cfree7"] = drSelectRowsStock[0]["cfree7"].ToString();  //自由项7，string类型
                //domBody[iRow]["cfree8"] = drSelectRowsStock[0]["cfree8"].ToString();  //自由项8，string类型
                //domBody[iRow]["cfree9"] = drSelectRowsStock[0]["cfree9"].ToString();  //自由项9，string类型
                //domBody[iRow]["cfree10"] = drSelectRowsStock[0]["cfree10"].ToString();  //自由项10，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["cunitid"] = drSelectRowsStock[0]["cunitid"].ToString(); //单位编码，string类型
                //domBody[iRow]["cinva_unit"] = drSelectRowsStock[0]["pu_ArrBody_cinva_unit"].ToString();//采购单位，string类型
                //domBody[iRow]["cinvm_unit"] = drSelectRowsStock[0]["pu_ArrBody_cinvm_unit"].ToString();//主计量，string类型
                //domBody[iRow]["igrouptype"] = drSelectRowsStock[0]["pu_ArrBody_igrouptype"].ToString(); //分组类型，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                domBody[iRow]["cdefine34"] = drSelectRowsSHOrderProduct[0]["SerialID"].ToString(); //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //
                decimal ioritaxcost = 0;
                if (drSelectRowsStock[0]["含税单价"] != DBNull.Value)
                {
                    ioritaxcost = Convert.ToDecimal(drSelectRowsStock[0]["含税单价"].ToString());
                }
                domBody[iRow]["ioritaxcost"] = ioritaxcost.ToString(); //含税单价，double类型
                //
                //domBody[iRow]["icorid"] = ""; //到货单子表id，int类型
                //中天不要批次 190109   domBody[iRow]["cbatch"] = drSelectRowsSHOrderProduct[0]["BatchNO"].ToString(); //批号，string类型
                //domBody[iRow]["dpdate"] = ""; //生产日期，DateTime类型
                //domBody[iRow]["dvdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //
                int bgsp = 0;
                if (drSelectRowsStock[0]["bgsp"] != DBNull.Value)
                {
                    bgsp = Convert.ToInt32(drSelectRowsStock[0]["bgsp"].ToString());
                }
                domBody[iRow]["bgsp"] = bgsp.ToString(); //是否检验，int类型
                domBody[iRow]["id"] = ID; //主表id，int类型
                //先注释掉，通过SQL刷domBody[iRow]["cwhcode"] = drSelectRowsStock[0]["Warehouse_cWhCode"].ToString();//cqz 仓库编码，string类型
                //domBody[iRow]["cwhname"] = drSelectRowsStock[0]["Warehouse_cWhName"].ToString();//cqz 仓库名称，string类型
                domBody[iRow]["cinvname"] = drSelectRowsStock[0]["品名"].ToString();//存货名称，string类型
                int btaxcost = 0;
                if (drSelectRowsStock[0]["btaxcost"] != DBNull.Value)
                {
                    if ((bool)drSelectRowsStock[0]["btaxcost"])
                    {
                        btaxcost = 1;
                    }
                    else
                    {
                        btaxcost = 0;
                    }
                }
                domBody[iRow]["btaxcost"] = btaxcost.ToString(); //单价标准，string类型
                //domBody[iRow]["binspect"] = ""; //是否已报检，int类型
                //domBody[iRow]["fvalidquantity"] = ""; //合格数量，double类型
                //domBody[iRow]["finvalidquantity"] = ""; //不合格数量，double类型
                //domBody[iRow]["frefusequantity"] = ""; //拒收数量，double类型
                //domBody[iRow]["cinvaddcode"] = ""; //存货代码，string类型
                //domBody[iRow]["frefusenum"] = ""; //拒收件数，double类型
                //domBody[iRow]["cveninvcode"] = ""; //供应商存货编码，string类型
                //domBody[iRow]["cveninvname"] = ""; //供应商存货名称，string类型
                //domBody[iRow]["bexigency"] = "0"; //是否急料，int类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["ippartid"] = ""; //母件Id，int类型
                //domBody[iRow]["ipquantity"] = ""; //母件数量，int类型
                //domBody[iRow]["iptoseq"] = ""; //选配序号，int类型
                domBody[iRow]["cordercode"] = drSelectRowsStock[0]["cPOID"].ToString();//订单号，string类型
                //domBody[iRow]["contractrowno"] = drSelectRowsStock[0]["contractrowno"].ToString();//合同标的编码，string类型
                //domBody[iRow]["contractrowguid"] = drSelectRowsStock[0]["contractrowguid"].ToString();//合同标的GUID，string类型
                //domBody[iRow]["contractcode"] = drSelectRowsStock[0]["contractcode"].ToString();//合同号，string类型
                domBody[iRow]["sotype"] = "0"; //需求跟踪方式，int类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["irowno"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["sodid"] = ""; //需求跟踪子表ID，string类型
                //domBody[iRow]["frealquantity"] = ""; //实收数量，double类型
                //domBody[iRow]["frealnum"] = ""; //实收件数，double类型
                //domBody[iRow]["fsumrefusequantity"] = ""; //已拒收数量，double类型
                //domBody[iRow]["fsumrefusenum"] = ""; //已拒收件数，double类型
                //domBody[iRow]["fvalidnum"] = ""; //合格件数，double类型
                domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，DateTime类型
                //domBody[iRow]["cbcloser"] = ""; //行关闭人，string类型
                //domBody[iRow]["dValidateDate"] = ""; //有效期，string类型
                //domBody[iRow]["iinvmpcost"] = ""; //最高进价，double类型
                //domBody[iRow]["cupsocode"] = ""; //不良品处理单号，string类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型
                //domBody[iRow]["iorderdid"] = ""; //销售订单子表id ，int类型
                domBody[iRow]["iordertype"] = "0"; //销售订单类型 ，int类型
                //domBody[iRow]["csoordercode"] = ""; //销售订单号 ，string类型
                //domBody[iRow]["iorderseq"] = ""; //销售订单行号 ，int类型
            }
            //给普通参数VoucherState赋值。此参数的数据类型为int，此参数按值传递，表示单据状态：2新增，1修改，0非编辑
            broker.AssignNormalValue("VoucherState", 2);

            //该参数curID为OUT型参数，由于其数据类型为string，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("curID")获取其值

            //该参数CurDom为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 CurDom = new MSXML2.DOMDocument();
            broker.AssignNormalValue("CurDom", CurDom);

            //给普通参数UserMode赋值。此参数的数据类型为int，此参数按值传递，表示模式，0：CS;1:BS
            broker.AssignNormalValue("UserMode", 0);

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strRetMsg = "";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRetMsg = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRetMsg = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRetMsg = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRetMsg;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.String，此参数按值传递，表示错误描述：空，正确；非空，错误
            System.String result = broker.GetReturnValue() as System.String;
            if (result != null && result != string.Empty)
            {
                broker.Release();
                return "失败！" + result;
            }
            //获取out/inout参数值

            //获取普通OUT参数curID。此返回值数据类型为string，在使用该参数之前，请判断是否为空
            string curIDRet = broker.GetResult("curID") as string;

            //获取普通OUT参数CurDom。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 CurDomRet = Convert.ToObject(broker.GetResult("CurDom"));

            //结束本次调用，释放API资源
            broker.Release();
            #region 由于代管仓库不能赋值，所以通过SQL回刷
            DataSet dsPO = new DataSet();
            DataTableName dtnPO = new DataTableName();
            dtnPO.strSelectSQL = "select * from " + strYongYouDBName + ".dbo.PU_ArrivalVouchs where id in (select id from " + strYongYouDBName + ".dbo.PU_ArrivalVouch where isnull(cDefine10,'')='" + strPDASerialNum + "')";
            dtnPO.strSaveSQL = "select * from " + strYongYouDBName + ".dbo.PU_ArrivalVouchs";
            dtnPO.strTableName = "PU_ArrivalVouchs";
            //
            try
            {
                dsPO = CustomizableDesignBLL.GetData(dtnPO, true);
            }
            catch (Exception ex)
            {
                return "刷新采购到货单的仓库出错:" + ex.Message;
            }
            #region 世宝的仓库获取方法  通过采购类型 是代管采购的取存货的默认仓库作为仓库，不是的取自定义字段1的仓库作为仓库
            //for (int iRow = 0; iRow < dtRealFBKC.DefaultView.Count; iRow++)
            //{
            //    DataRow[] drSelectRows = dsPO.Tables[0].Select("cdefine34=" + dtRealFBKC.DefaultView[iRow]["SerialID"].ToString());
            //    if (drSelectRows.Length == 0)
            //    {
            //        return "刷新采购到货单的仓库出错:第" + (iRow + 1).ToString() + "行没有找到";
            //    }
            //    string strID = dtRealFBKC.DefaultView[iRow]["ID"].ToString();
            //    DataRow[] drSelectRowsStock = dsStock.Tables[0].Select("DetailID='" + strID + "'");
            //    if (drSelectRowsStock.Length == 0)
            //    {
            //        return "刷新采购到货单的仓库出错:第" + (iRow + 1).ToString() + "行没有找到到货单";
            //    }
            //    //仓库编码
            //    if (drSelectRowsStock[0]["cBusType"].ToString() == "代管采购")
            //    {
            //        drSelectRows[0]["cWhCode"] = drSelectRowsStock[0]["仓库编码"].ToString();
            //    }
            //    else
            //    {
            //        if (drSelectRowsStock[0]["cInvDefine1"].ToString().Trim() == string.Empty)
            //        {
            //            return "第" + (iRow + 1).ToString() + "行没有设置对应的仓库";
            //        }
            //        drSelectRows[0]["cWhCode"] = drSelectRowsStock[0]["cInvDefine1"].ToString();
            //    }
            //    //
            //    drSelectRows[0].EndEdit();
            //}
            #endregion

            foreach (DataRowView drv in dsPO.Tables["PU_ArrivalVouchs"].DefaultView)
            {
                string strShowcWhName = dsPDACGDH.Tables["T_CGDH"].DefaultView[0]["cWhName"].ToString();
                string strcWHCode = "";
                string strcWhaName = "";
                int iStartIndex = strShowcWhName.IndexOf('(');
                int iEndIndex = strShowcWhName.IndexOf(')');
                if (iStartIndex >= 0 && iEndIndex > 0 && iEndIndex > iStartIndex)
                {
                    strcWHCode = strShowcWhName.Substring(iStartIndex + 1, iEndIndex - iStartIndex - 1);
                    strcWhaName = strShowcWhName.Substring(iEndIndex + 1, strShowcWhName.Length - iEndIndex - 1);
                }
                drv["cWhCode"] = strcWHCode;
                drv.EndEdit();
            }
            DataTableName.SaveAfterSQL sql1 = new DataTableName.SaveAfterSQL();
            sql1.strSQL = "update " + strYongYouDBName + ".dbo.PU_ArrivalVouch\r\n" +
                            "set cmaker=(select top 1 cUser_Name from UFSystem.dbo.UA_User where cuser_id='" + sUserID + "')\r\n" +
                                "where isnull(cDefine10,'')='" + strPDASerialNum + "'";
            dtnPO.SaveAfterSQLList.Add(sql1);
            //保存
            try
            {
                if (dsPO.GetChanges() != null)
                    CustomizableDesignBLL.SaveData(dsPO.GetChanges(), dtnPO);
            }
            catch (Exception ex)
            {
                return "保存采购到货单的仓库出错";
            }
            #endregion
            //
            dtSHFBIDAndQty = dtRealFBKC;
            return "";
        }
        #endregion
        #region 从到货单/报检单生成采购入库API
        /// <summary>
        /// 从到货单/报检单生成采购入库API
        /// </summary>
        /// <param name="strYongYouDBName">UFDATA_999_2014</param>
        /// <param name="sAccID">999</param>
        /// <param name="sYear">2017</param>
        /// <param name="sUserID">demo</param>
        /// <param name="sPassword">demo</param>
        /// <param name="sDate">2017-08-19</param>
        /// <param name="sServer">127.0.0.1</param>
        /// <param name="dsInStorage">入库信息</param>
        /// <returns></returns>
        public string YYInStorageCG(string strPath, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, DataSet dsInStorage, DataSet dsDaiRuku)
        {
            string strType = dsInStorage.Tables[0].DefaultView[0]["OrderType"].ToString();

            string strRKClassName = "";
            List<string> strRKClassNameList = new List<string>();
            DateTime dtNow = DateTime.Now.Date;
            int ID = 0;
            int AutoID = 0;
            string strInStorageNum = "test123456";
            List<DataTableName> dtnList = new List<DataTableName>();
            DataTableName dtn = new DataTableName();
            if (dsInStorage.Tables["T_CgAppInstorage"].DefaultView.Count == 0)
            {
                return "采购入库单号不存在！";
            }
            if (dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView.Count == 0)
            {
                return "采购入库明细信息不存在！";
            }
            if (dsInStorage.Tables["T_CgAppInstorage"].DefaultView[0]["StorageName"].ToString().Trim() == string.Empty)
            {
                return "仓库不能为空！";
            }
            //判断是否已经搞过了 
            string strSerialNum = dsInStorage.Tables["T_CgAppInstorage"].DefaultView[0]["SerialNum"].ToString();
            string strISExists = "SELECT * FROM " + strYongYouDBName + ".dbo.RdRecord01 RdRecord01 where isnull(cDefine10,'')='" + strSerialNum + "'";
            DataSet dsISExists = new DataSet();
            try
            {
                dsISExists = CustomizableDesignBLL.GetData(strISExists);
            }
            catch (Exception ex)
            {
                return "判断号已经做过入库单，出错：" + ex.Message;
            }
            if (dsISExists != null && dsISExists.Tables[0].DefaultView.Count > 0)
            {
                return "单号已经做过入库单";
            }
            //
            //
            dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView.Sort = "SortID";
            //
            #region 获取条码数据
            string strBarCodeWhere = "";
            for (int i = 0; i < dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView.Count; i++)
            {
                string strBarCode = dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[i]["BarCode"].ToString();

                if (strBarCodeWhere == "")
                {
                    strBarCodeWhere = "'" + strBarCode + "'";
                }
                else
                {
                    strBarCodeWhere = strBarCodeWhere + ",'" + strBarCode + "'";
                }
            }
            DataSet dsBarCode = new DataSet();
            //
            string strBarSql = "SELECT *FROM dbo.T_BarCode WHERE BarCode IN (" + strBarCodeWhere + ")";
            //
            try
            {
                dsBarCode = CustomizableDesignBLL.GetData(strBarSql);
            }
            catch (Exception ex)
            {
                return "获取条码数据，出错：" + ex.Message;
            }
            if (dsBarCode == null || dsBarCode.Tables[0].DefaultView.Count == 0)
            {
                return "获取条码数据为空,无法生成";
            }
            #endregion
            //
            #region 创建一个根据批次，存货编码，有效期，货位，汇总数量的表
            DataTable dtRealQty = new DataTable();
            dtRealQty.Columns.Add(new DataColumn("SerialID", typeof(int)));
            dtRealQty.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("cPosCode", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("SHBacthNo", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("EndDate", typeof(DateTime)));
            dtRealQty.Columns.Add(new DataColumn("ValidDate", typeof(int)));
            dtRealQty.Columns.Add(new DataColumn("Quantity", typeof(decimal)));
            #endregion
            #region 汇总扫描明细表
            int iSerialID = 1;
            for (int i = 0; i < dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView.Count; i++)
            {
                string strcInvCode = dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[i]["CHNum"].ToString();
                string strSHBacthNo = dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[i]["SHBacthNo"].ToString();
                string strcPosCode = dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[i]["cPosCode"].ToString();
                string strBarCode = dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[i]["BarCode"].ToString();
                int iValidDate = -1;
                //失效日期
                DateTime dtEndDate = new DateTime(1999, 1, 1);
                bool bisNeedDate = false;
                DataRow[] drSelectBarCode = dsBarCode.Tables[0].Select("BarCode='" + strBarCode + "'");
                if (drSelectBarCode.Length > 0)
                {
                    bisNeedDate = drSelectBarCode[0]["EndDate"] == DBNull.Value ? false : true;
                    if (bisNeedDate)
                        dtEndDate = Convert.ToDateTime(drSelectBarCode[0]["EndDate"]);
                    //
                    if (drSelectBarCode[0]["ValidDate"] != DBNull.Value)
                        iValidDate = Convert.ToInt32(drSelectBarCode[0]["ValidDate"]);

                }
                //数量
                decimal decBarCount = 0;
                //
                if (dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[i]["BarCount"] != DBNull.Value)
                {
                    decBarCount = Convert.ToDecimal(dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[i]["BarCount"].ToString());
                }
                //
                if (bisNeedDate)
                {
                    dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and cPosCode='" + strcPosCode + "' and SHBacthNo='" + strSHBacthNo + "' and EndDate='" + dtEndDate.ToString() + "'";
                    if (dtRealQty.DefaultView.Count > 0)
                    {
                        decimal decBaseQty = Convert.ToDecimal(dtRealQty.DefaultView[0]["Quantity"].ToString());
                        //
                        dtRealQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                        dtRealQty.DefaultView[0].EndEdit();
                    }
                    else
                    {
                        DataRow drNew = dtRealQty.NewRow();
                        drNew["SerialID"] = iSerialID;
                        drNew["cInvCode"] = strcInvCode;
                        drNew["cPosCode"] = strcPosCode;
                        drNew["SHBacthNo"] = strSHBacthNo;
                        drNew["EndDate"] = dtEndDate;
                        drNew["ValidDate"] = iValidDate;
                        drNew["Quantity"] = decBarCount;
                        dtRealQty.Rows.Add(drNew);
                        iSerialID++;
                    }
                }
                else
                {
                    dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and cPosCode='" + strcPosCode + "' and SHBacthNo='" + strSHBacthNo + "' and EndDate is null ";
                    if (dtRealQty.DefaultView.Count > 0)
                    {
                        decimal decBaseQty = Convert.ToDecimal(dtRealQty.DefaultView[0]["Quantity"].ToString());
                        //
                        dtRealQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                        dtRealQty.DefaultView[0].EndEdit();
                    }
                    else
                    {
                        DataRow drNew = dtRealQty.NewRow();
                        drNew["SerialID"] = iSerialID;
                        drNew["cInvCode"] = strcInvCode;
                        drNew["cPosCode"] = strcPosCode;
                        drNew["SHBacthNo"] = strSHBacthNo;
                        drNew["Quantity"] = decBarCount;
                        dtRealQty.Rows.Add(drNew);
                        iSerialID++;
                    }
                }
            }
            dtRealQty.DefaultView.RowFilter = "";
            #endregion
            #region 创建真正作为入库记录的表
            DataTable dtRealFBInstorage = new DataTable();
            dtRealFBInstorage.Columns.Add(new DataColumn("GroupSerialID", typeof(int)));
            dtRealFBInstorage.Columns.Add(new DataColumn("DHAutoID", typeof(string)));
            dtRealFBInstorage.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dtRealFBInstorage.Columns.Add(new DataColumn("cPosCode", typeof(string)));
            dtRealFBInstorage.Columns.Add(new DataColumn("SHBacthNo", typeof(string)));
            dtRealFBInstorage.Columns.Add(new DataColumn("EndDate", typeof(DateTime)));
            dtRealFBInstorage.Columns.Add(new DataColumn("ValidDate", typeof(int)));
            dtRealFBInstorage.Columns.Add(new DataColumn("Quantity", typeof(decimal)));
            #endregion
            //只要取到到货单就够了，都是从到货单来的数据的。有检验单的根据到货单子表ID查到检验单的明细 取到检验单的主细表ID赋值就行了
            dsDaiRuku.Tables[0].DefaultView.Sort = "DHAutoID desc";
            //这里根据待入库的单据信息，把汇总的明细表数据分配到对应的待入库单据里面。
            //可能会出现多个待入库记录对应一个 汇总明细记录的,也有多个汇总明细对应一个记录的
            //这里的逻辑就是循环待入库明细，依次分配汇总明细里面的数据，然后给到真正的中间库存表
            //
            string strDetailWhere = string.Empty;
            //
            #region 分配汇总明细的数据数量
            DataTable dtFBRealQty = dtRealQty.Copy();
            foreach (DataRowView drvDarRuku in dsDaiRuku.Tables[0].DefaultView)
            {
                string strDHAutoID = drvDarRuku["DHAutoID"].ToString();
                //
                if (strDetailWhere == string.Empty)
                {
                    strDetailWhere = "'" + strDHAutoID + "'";
                }
                else
                {
                    strDetailWhere = strDetailWhere + ",'" + strDHAutoID + "'";
                }
                //
                #region 分配 汇总明细表的产品和数量
                decimal decNeeInstoageQty = drvDarRuku["NeedInstoageQty"] == DBNull.Value ? 0 : (decimal)drvDarRuku["NeedInstoageQty"];
                string strCinvCode = drvDarRuku["cinvcode"].ToString();
                dtFBRealQty.DefaultView.RowFilter = "cInvCode='" + strCinvCode + "'";
                if (dtFBRealQty.DefaultView.Count == 0)
                {
                    return "选择待入库中需要扫描存货编码" + strCinvCode + "，扫描明细中未扫描，请扫描！";
                }
                else
                {
                    dtFBRealQty.DefaultView.Sort = "SerialID";
                    //
                    for (int iFB = 0; iFB < dtFBRealQty.DefaultView.Count; iFB++)
                    {
                        decimal decFBQty = dtFBRealQty.DefaultView[iFB]["Quantity"] == DBNull.Value ? 0 : (decimal)dtFBRealQty.DefaultView[iFB]["Quantity"];
                        //
                        if (decFBQty == 0)
                            continue;
                        //
                        if (decFBQty > decNeeInstoageQty)
                        {
                            DataRow drnew = dtRealFBInstorage.NewRow();
                            //
                            drnew["GroupSerialID"] = dtFBRealQty.DefaultView[iFB]["SerialID"];
                            drnew["DHAutoID"] = strDHAutoID;
                            drnew["cInvCode"] = dtFBRealQty.DefaultView[iFB]["cInvCode"];
                            drnew["cPosCode"] = dtFBRealQty.DefaultView[iFB]["cPosCode"];
                            drnew["SHBacthNo"] = dtFBRealQty.DefaultView[iFB]["SHBacthNo"];
                            drnew["EndDate"] = dtFBRealQty.DefaultView[iFB]["EndDate"];
                            drnew["ValidDate"] = dtFBRealQty.DefaultView[iFB]["ValidDate"];
                            drnew["Quantity"] = decNeeInstoageQty;
                            drnew.EndEdit();
                            //
                            dtRealFBInstorage.Rows.Add(drnew);
                            //
                            decimal decKCQty = Math.Round(decFBQty - decNeeInstoageQty, 2);
                            dtFBRealQty.DefaultView[iFB]["Quantity"] = decKCQty;
                            dtFBRealQty.DefaultView[iFB].EndEdit();
                        }
                        else
                        {
                            DataRow drnew = dtRealFBInstorage.NewRow();
                            //
                            drnew["GroupSerialID"] = dtFBRealQty.DefaultView[iFB]["SerialID"];
                            drnew["DHAutoID"] = strDHAutoID;
                            drnew["cInvCode"] = dtFBRealQty.DefaultView[iFB]["cInvCode"];
                            drnew["cPosCode"] = dtFBRealQty.DefaultView[iFB]["cPosCode"];
                            drnew["SHBacthNo"] = dtFBRealQty.DefaultView[iFB]["SHBacthNo"];
                            drnew["EndDate"] = dtFBRealQty.DefaultView[iFB]["EndDate"];
                            drnew["ValidDate"] = dtFBRealQty.DefaultView[iFB]["ValidDate"];
                            drnew["Quantity"] = decFBQty;
                            drnew.EndEdit();
                            //
                            dtRealFBInstorage.Rows.Add(drnew);
                            //
                            decimal decNeeQty = Math.Round(decNeeInstoageQty - decFBQty, 2);
                            decNeeInstoageQty = decNeeQty;
                            dtFBRealQty.DefaultView[iFB]["Quantity"] = 0;
                            dtFBRealQty.DefaultView[iFB].EndEdit();
                        }
                    }
                    //
                }
                #endregion
            }
            #endregion
            //
            if (strDetailWhere == string.Empty)
            {
                return "采购入库明细信息的条码为空！";
            }
            //取用友的到货单数据
            DataSet dsStock = new DataSet();
            dtnList = new List<DataTableName>();
            //
            dtn = new DataTableName();
            dtn.strSelectSQL = "select PU_ArrivalVouch.*,\r\n" +
                                "(select cVenName from " + strYongYouDBName + ".dbo.vendor where cVenCode=PU_ArrivalVouch.cVenCode) cVenName\r\n" +
                               " FROM  " + strYongYouDBName + ".dbo.PU_ArrivalVouchs PU_ArrivalVouchs " +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch ON PU_ArrivalVouch.id = PU_ArrivalVouchs.id\r\n" +
                               " where PU_ArrivalVouchs.Autoid in (" + strDetailWhere + ")";
            dtn.strTableName = "PU_ArrivalVouch";
            dtnList.Add(dtn);
            //
            dtn = new DataTableName();
            dtn.strSelectSQL = "select " +
                                "PU_ArrivalVouch.cCode,\r\n" +
                                "PU_ArrivalVouch.ddate,\r\n" +
                                "PU_ArrivalVouch.cbustype,\r\n" +
                                "PU_ArrivalVouchs.*,\r\n" +
                                "(select cVenName from " + strYongYouDBName + ".dbo.vendor where cVenCode=PU_ArrivalVouch.cVenCode) cVenName,\r\n" +
                                 "(select cSTComUnitCode from " + strYongYouDBName + ".dbo.Inventory where cInvCode=PU_ArrivalVouchs.cInvCode) cSTComUnitCode,\r\n" +
                                 "(select cComUnitCode from " + strYongYouDBName + ".dbo.Inventory where cInvCode=PU_ArrivalVouchs.cInvCode) cComUnitCode\r\n" +
                               " FROM  " + strYongYouDBName + ".dbo.PU_ArrivalVouchs PU_ArrivalVouchs  " +
                               " LEFT JOIN " + strYongYouDBName + ".dbo.PU_ArrivalVouch PU_ArrivalVouch ON PU_ArrivalVouch.id = PU_ArrivalVouchs.id\r\n" +
                               " where PU_ArrivalVouchs.Autoid in (" + strDetailWhere + ")";
            dtn.strTableName = "PU_ArrivalVouchs";
            dtnList.Add(dtn);
            try
            {
                dsStock = CustomizableDesignBLL.GetData(dtnList, false);
            }
            catch (Exception ex)
            {
                return "取采购入库的数据出错：" + ex.Message;
            }
            //根据到货单是否需要检验到检验单数据
            string strQCWhere = "";
            foreach (DataRowView drv in dsStock.Tables["PU_ArrivalVouchs"].DefaultView)
            {
                if (drv["bGsp"] == DBNull.Value)
                    continue;
                if (drv["bGsp"].ToString() != "1")
                    continue;
                if (strQCWhere == "")
                {
                    strQCWhere = "SOURCEAUTOID=" + drv["AutoID"].ToString();
                }
                else
                {
                    strQCWhere = strQCWhere + " or SOURCEAUTOID=" + drv["AutoID"].ToString();
                }
            }
            string strQCSQL = "";
            if (strQCWhere == "")
            {
                strQCSQL = "select top 0 * from " + strYongYouDBName + ".dbo.QMCHECKVOUCHER";
            }
            else
            {
                strQCSQL = "select * from " + strYongYouDBName + ".dbo.QMCHECKVOUCHER where " + strQCWhere;
            }
            DataSet dsQC = new DataSet();
            try
            {
                dsQC = CustomizableDesignBLL.GetData(strQCSQL);
            }
            catch (Exception ex)
            {
                return "取检验单的数据出错：" + ex.Message;
            }

            foreach (DataRowView drvDHDetail in dsStock.Tables["PU_ArrivalVouchs"].DefaultView)
            {
                string strRKClassNameTemp = "";
                //委到、采到、委检、采检
                //到货单中有没有存在

                if (drvDHDetail["cbustype"].ToString() == "委外加工")
                    strRKClassNameTemp = "委到";
                else
                    strRKClassNameTemp = "采到";
                //检验单中有没有存在
                if (drvDHDetail["bGsp"] != DBNull.Value && drvDHDetail["bGsp"].ToString() == "1")
                {
                    if (dsQC.Tables[0].Select("SOURCEAUTOID=" + drvDHDetail["AutoID"].ToString()).Length == 0)
                    {
                        return "选中的到货单中有单据需要检验，但未找到对应的检验单记录！";
                    }
                    if (drvDHDetail["cbustype"].ToString() == "委外加工")
                        strRKClassNameTemp = "委检";
                    else
                        strRKClassNameTemp = "采检";
                }
                //判断是否存在多种数据来源
                if (strRKClassNameTemp != string.Empty)
                {
                    if (strRKClassNameList.IndexOf(strRKClassNameTemp) < 0)
                        strRKClassNameList.Add(strRKClassNameTemp);
                }
            }
            if (strRKClassNameList.Count == 0)
            {
                return "入库来源不能为空";
            }
            if (strRKClassNameList.Count > 1)
            {
                return "入库来源必须相同";
            }
            strRKClassName = strRKClassNameList[0];
            if (strRKClassName != "委到" && strRKClassName != "采到" && strRKClassName != "委检" && strRKClassName != "采检")
            {
                return "入库来源必须是“委外到货单，采购到货单，来料检验单，来料检验单";
            }
            //取用友的存货档案
            string strInventoryWhere = "";
            for (int i = 0; i < dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView.Count; i++)
            {
                string strCHNum = dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[i]["CHNum"].ToString();
                if (strCHNum == string.Empty)
                    continue;
                if (strInventoryWhere == "")
                    strInventoryWhere = "'" + strCHNum + "'";
                else
                    strInventoryWhere = strInventoryWhere + " , '" + strCHNum + "'";
            }
            if (strInventoryWhere == "")
            {
                return "采购入库明细信息的存货编码为空！";
            }
            //获取仓库
            string strStorageName = dsInStorage.Tables["T_CgAppInstorage"].DefaultView[0]["StorageName"].ToString();
            string strcwhcode = "";
            int iStartIndex = strStorageName.IndexOf('(');
            int iEndIndex = strStorageName.IndexOf(')');
            if (iStartIndex >= 0 && iEndIndex > 0 && iEndIndex > iStartIndex)
            {
                strcwhcode = strStorageName.Substring(iStartIndex + 1, iEndIndex - iStartIndex - 1);
            }
            //
            List<DataTableName> dtnInvList = new List<DataTableName>();
            DataTableName dtnInv = new DataTableName();
            dtnInv.strSelectSQL = "select * from " + strYongYouDBName + ".dbo.Inventory where cInvCode in (" + strInventoryWhere + ")";
            dtnInv.strTableName = "Inventory";
            dtnInvList.Add(dtnInv);
            //string strInventorySQL = "select * from" + strYongYouDBName + ".dbo.Inventory where cInvCode in (" + strInventoryWhere + ")
            dtnInv = new DataTableName();
            dtnInv.strSelectSQL = "select * from " + strYongYouDBName + ".dbo.Warehouse where cWhCode ='" + strcwhcode + "'";
            dtnInv.strTableName = "Warehouse";
            dtnInvList.Add(dtnInv);
            DataSet dsInventory = new DataSet();
            try
            {
                dsInventory = CustomizableDesignBLL.GetData(dtnInvList, false);
            }
            catch (Exception ex)
            {
                return "取存货档案的数据出错：" + ex.Message;
            }
            bool bWhPos = false;
            if (dsInventory.Tables["Warehouse"].DefaultView.Count > 0)
                bWhPos = dsInventory.Tables["Warehouse"].DefaultView[0]["bWhPos"] == DBNull.Value ? false : (bool)dsInventory.Tables["Warehouse"].DefaultView[0]["bWhPos"];

            if (bWhPos)
            {
                //判断有没有货位、到货单，和检验单
                for (int iRow = 0; iRow < dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView.Count; iRow++)
                {
                    string strBarCode = dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[iRow]["BarCode"].ToString().Trim();
                    string cposition = dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[iRow]["cPosCode"].ToString().Trim();
                    if (cposition == string.Empty)
                    {
                        return "第" + (iRow + 1).ToString() + "行" + strBarCode + "的货位没有选择！";
                    }
                }
            }
            #region 写入入库单
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }
            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/PuStoreIn/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/PuStoreIn/Add");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);


            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：01
            broker.AssignNormalValue("sVouchType", "01");

            //给BO表头参数DomHead赋值，此BO参数的业务类型为采购入库单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法
            ID = ID + 1;//加1
            #region 表头
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            DomHead[0]["id"] = ID; //主关键字段，int类型  4 
            DomHead[0]["bomfirst"] = "0"; //委外期初标志，string类型
            DomHead[0]["ccode"] = strInStorageNum; //入库单号，string类型
            DomHead[0]["ddate"] = sDate;  //入库日期，DateTime类型
            DomHead[0]["iverifystate"] = "0"; //iverifystate，int类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，int类型
            DomHead[0]["cvenabbname"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["cVenName"].ToString();//供货单位，string类型
            DomHead[0]["cbustype"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["cbustype"].ToString(); //业务类型，int类型
            DomHead[0]["cmaker"] = dsInStorage.Tables[0].DefaultView[0]["CreaterName"].ToString(); ; //制单人，string类型
            DomHead[0]["iexchrate"] = "1"; //汇率，double类型
            DomHead[0]["cexch_name"] = "人民币"; //币种，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            DomHead[0]["bpufirst"] = "0"; //采购期初标志，string类型
            DomHead[0]["cvencode"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["cVenCode"].ToString(); //供货单位编码，string类型
            DomHead[0]["cvouchtype"] = "01"; //单据类型，string类型

            DomHead[0]["cwhcode"] = strcwhcode;//仓库编码，string类型 //仓库编码，string类型
            DomHead[0]["brdflag"] = "1"; //收发标志，int类型
            if (strRKClassName == "委到")
                DomHead[0]["csource"] = "委外到货单";
            else if (strRKClassName == "采到")
                DomHead[0]["csource"] = "采购到货单";
            else if (strRKClassName == "委检")
                DomHead[0]["csource"] = "来料检验单";
            else if (strRKClassName == "采检")
                DomHead[0]["csource"] = "来料检验单";
            //
            if (dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["iflowid"] != DBNull.Value)
                DomHead[0]["iflowid"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["iflowid"].ToString(); //cqz 流程ID，string类型
            //DomHead[0]["iflowid"] = ""; //流程模式ID，string类型
            //DomHead[0]["cflowname"] = ""; //流程模式描述，string类型
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型


            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            DomHead[0]["dnmaketime"] = dtNow.ToString("yyyy-MM-dd"); //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            //DomHead[0]["cwhname"] = strcwhname; //仓库，string类型
            DomHead[0]["cordercode"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["cpocode"].ToString(); //订单号，string类型
            DomHead[0]["carvcode"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["cCode"].ToString(); //到货单号，string类型
            //DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            //DomHead[0]["cbuscode"] = ""; //业务号，string类型
            //DomHead[0]["cdepname"] = dsStock.Tables[0].DefaultView[0]["部门名称"].ToString();//部门，string类型
            //DomHead[0]["cpersonname"] = dsStock.Tables[0].DefaultView[0]["cPsn_Name"].ToString();//cqz 业务员，string类型
            if (dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["dDate"] == DBNull.Value)
            {
                return "到货单日期为空，无法继续";
            }
            DomHead[0]["darvdate"] = ((DateTime)dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["dDate"]).ToString("yyyy-MM-dd"); //到货日期，DateTime类型
            //DomHead[0]["cptname"] = dsStock.Tables[0].DefaultView[0]["cPTName"].ToString();//采购类型，string类型
            //if(dsStock.Tables[0].DefaultView[0]["cPTName"].ToString().IndexOf("委外")>=0)
            //    DomHead[0]["crdname"] = "委托加工入库"; //入库类别，string类型
            //else
            //    DomHead[0]["crdname"] = "采购入库"; //入库类别，string类型
            //DomHead[0]["dveridate"] = ""; //审核日期，DateTime类型
            //DomHead[0]["cvenpuomprotocol"] = ""; //收付款协议编码，string类型
            //DomHead[0]["cvenpuomprotocolname"] = ""; //收付款协议名称，string类型
            //DomHead[0]["dcreditstart"] = ""; //立账日，DateTime类型
            //DomHead[0]["icreditperiod"] = ""; //账期，int类型
            //DomHead[0]["dgatheringdate"] = ""; //到期日，DateTime类型
            DomHead[0]["bcredit"] = "0"; //是否为立账单据，int类型
            //DomHead[0]["cvenfullname"] = dsStock.Tables[0].DefaultView[0]["供应商名称"].ToString();//供应商全称，string类型
            //DomHead[0]["cmemo"] = "陈亲增测试用马上删"; //备注，string类型
            //DomHead[0]["chandler"] = ""; //审核人，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型

            string stritaxrate = "0";
            if (strRKClassName == "委到")
            {
                stritaxrate = "0";
            }
            else if (strRKClassName == "采到")
            {
                stritaxrate = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["itaxrate"] == DBNull.Value ? "0" : dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["itaxrate"].ToString();
            }
            else if (strRKClassName == "委检")
            {
                stritaxrate = "0";
            }
            else if (strRKClassName == "采检")
            {
                stritaxrate = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["itaxrate"] == DBNull.Value ? "0" : dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["itaxrate"].ToString();
            }
            DomHead[0]["itaxrate"] = stritaxrate;//税率，double类型
            //DomHead[0]["isalebillid"] = ""; //发票号，string类型
            //DomHead[0]["ipurorderid"] = ""; //采购订单ID，string类型

            if (strRKClassName == "委到")
            {
                DomHead[0]["ipurarriveid"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["id"].ToString();
            }
            else if (strRKClassName == "采到")
            {
                DomHead[0]["ipurarriveid"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["id"].ToString();
            }
            else if (strRKClassName == "委检")
            {
                //DomHead[0]["ipurarriveid"] = "";
            }
            else if (strRKClassName == "采检")
            {
                //DomHead[0]["ipurarriveid"] = "";
            }
            //DomHead[0]["ipurarriveid"] = dsStock.Tables[0].DefaultView[0]["ID"].ToString();//采购到货单ID，string类型

            //DomHead[0]["iarriveid"] = ""; //到货单ID，string类型
            //DomHead[0]["dchkdate"] = ""; //检验日期，DateTime类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["gspcheck"] = ""; //gsp复核标志，string类型
            //DomHead[0]["cchkperson"] = ""; //检验员，string类型

            if (strRKClassName == "委到")
            {
                //DomHead[0]["cchkcode"] = ""; //检验单号，string类型
            }
            else if (strRKClassName == "采到")
            {
                //DomHead[0]["cchkcode"] = ""; //检验单号，string类型
            }
            else if (strRKClassName == "委检")
            {
                DomHead[0]["cchkcode"] = dsQC.Tables[0].DefaultView[0]["CCHECKCODE"].ToString();
            }
            else if (strRKClassName == "采检")
            {
                DomHead[0]["cchkcode"] = dsQC.Tables[0].DefaultView[0]["CCHECKCODE"].ToString();
            }
            //DomHead[0]["cchkcode"] = strtemp; //检验单号，string类型

            DomHead[0]["vt_id"] = "27"; //模版号，int类型
            DomHead[0]["cdepcode"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["cdepcode"].ToString();//部门编码，string类型
            //DomHead[0]["cbillcode"] = ""; //发票id，string类型
            DomHead[0]["cptcode"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["cptcode"].ToString();//采购类型编码，string类型
            DomHead[0]["cpersoncode"] = dsStock.Tables["PU_ArrivalVouch"].DefaultView[0]["cpersoncode"].ToString();//业务员编码，string类型
            //
            //if (strRKClassName == "委到")
            //    DomHead[0]["crdcode"] = "13";
            //else if (strRKClassName == "采到")
            //    DomHead[0]["crdcode"] = "11";
            //else if (strRKClassName == "委检")
            //    DomHead[0]["crdcode"] = "105";
            //else if (strRKClassName == "采检")
            //    DomHead[0]["crdcode"] = "101";
            string strinOrout = dsInStorage.Tables[0].DefaultView[0]["InOrOut"].ToString();
            int iStartIndexrdCode = strinOrout.IndexOf('(');
            int iEndIndexrdCode = strinOrout.IndexOf(')');
            if (iStartIndexrdCode >= 0 && iEndIndexrdCode > 0 && iEndIndexrdCode > iStartIndexrdCode)
            {
                strinOrout = strinOrout.Substring(iStartIndexrdCode + 1, iEndIndexrdCode - iStartIndexrdCode - 1);
            }
            else
            {
                strinOrout = "";
            }

            DomHead[0]["crdcode"] = strinOrout;//"101"; //入库类别编码，string类型

            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["cdefine16"] = ""; //0 cqz 表头自定义项16，double类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["iproorderid"] = ""; //生产订单Id，string类型
            //DomHead[0]["bisstqc"] = "0"; //库存期初标记，string类型
            //DomHead[0]["cdefine1"] = ""; //傅奇cqz 表头自定义项1，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            //DomHead[0]["idiscounttaxtype"] = "0"; //扣税类别，int类型
            //DomHead[0]["cdefine5"] = ""; //0cqz表头自定义项5，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["cdefine7"] = ""; //0cqz表头自定义项7，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            DomHead[0]["cdefine10"] = strSerialNum; //表头自定义项10，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            #endregion
            //broker.AssignNormalValue("DomHead", broker.GetBoParam("DomHead").ToRSDOM());
            //给BO表体参数domBody赋值，此BO参数的业务类型为采购入库单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法
            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //new YYAPI.Log().LogWrite(strPath, "14");
            //方法二是构造BusinessObject对象，具体方法如下：
            #region 表体
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = dtRealFBInstorage.DefaultView.Count;// dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            for (int iRow = 0; iRow < dtRealFBInstorage.DefaultView.Count; iRow++)
            {
                //货位
                string cposition = dtRealFBInstorage.DefaultView[iRow]["cPosCode"].ToString();
                if (cposition == string.Empty)
                {
                    if (bWhPos)
                        return "第" + (iRow + 1).ToString() + "行的货位为空！";
                }
                iStartIndex = cposition.IndexOf('(');
                iEndIndex = cposition.IndexOf(')');
                if (iStartIndex >= 0 && iEndIndex > 0 && iEndIndex > iStartIndex)
                {
                    cposition = cposition.Substring(iStartIndex + 1, iEndIndex - iStartIndex - 1);
                }
                else
                {
                    cposition = "";
                }
                string strDHAutoID = dtRealFBInstorage.DefaultView[iRow]["DHAutoID"].ToString();
                DataRow[] drSelectRowsStock = dsStock.Tables["PU_ArrivalVouchs"].Select(" Autoid='" + strDHAutoID + "'");
                if (drSelectRowsStock.Length == 0)
                {
                    return "第" + (iRow + 1).ToString() + "行的条码相对应的到货单未找到！";
                }
                DataRow[] drSelectRowsQC = dsQC.Tables[0].Select("SOURCEAUTOID=" + drSelectRowsStock[0]["AutoID"].ToString());
                if (strRKClassName == "委检" || strRKClassName == "采检")
                {
                    if (drSelectRowsStock.Length == 0)
                    {
                        return "第" + (iRow + 1).ToString() + "行的条码相对应的报检单未找到！";
                    }
                }
                //
                string strCHNum = dtRealFBInstorage.DefaultView[iRow]["cInvCode"].ToString();
                DataRow[] drSelectRowsInventory = dsInventory.Tables[0].Select("cInvCode='" + strCHNum + "'");
                if (drSelectRowsInventory.Length == 0)
                {
                    return "第" + (iRow + 1).ToString() + "行的条码相对应的存货档案未找到！";
                }
                bool bInvQuality = drSelectRowsInventory[0]["bInvQuality"] == DBNull.Value ? false : (bool)drSelectRowsInventory[0]["bInvQuality"];
                bool bInvBatch = drSelectRowsInventory[0]["bInvBatch"] == DBNull.Value ? false : (bool)drSelectRowsInventory[0]["bInvBatch"];
                int iMassDate = drSelectRowsInventory[0]["iMassDate"] == DBNull.Value ? 0 : Convert.ToInt32(drSelectRowsInventory[0]["iMassDate"].ToString());
                int cMassUnit = drSelectRowsInventory[0]["cMassUnit"] == DBNull.Value ? 0 : Convert.ToInt32(drSelectRowsInventory[0]["cMassUnit"].ToString());
                //
                AutoID = AutoID + 1;
                //数量
                decimal iQuantity = dtRealFBInstorage.DefaultView[iRow]["Quantity"] == DBNull.Value ? 0 : Convert.ToDecimal(dtRealFBInstorage.DefaultView[iRow]["Quantity"].ToString());
                ////检验不合格数量
                //decimal decFREGBREAKQUANTITY = 0;
                //if (dsQC.Tables[0].DefaultView.Count > 0)
                //{
                //    decFREGBREAKQUANTITY = dsQC.Tables[0].DefaultView[0]["FREGBREAKQUANTITY"] == DBNull.Value ? 0 : Convert.ToDecimal(dsQC.Tables[0].DefaultView[0]["FREGBREAKQUANTITY"]);
                //}
                //入库数量=条码数量-不合格数量
                // iQuantity = iQuantity - decFREGBREAKQUANTITY;
                //税率
                decimal iTaxRate = drSelectRowsStock[0]["itaxrate"] == DBNull.Value ? 0 : Convert.ToDecimal(drSelectRowsStock[0]["itaxrate"].ToString());
                //含税单价
                decimal iOriTaxCost = drSelectRowsStock[0]["iOriTaxCost"] == DBNull.Value ? 0 : Convert.ToDecimal(drSelectRowsStock[0]["iOriTaxCost"].ToString());
                //含税金额=数量*含税单价
                decimal iOriSum = Trade.DBUtility.Common.decimalEx.RoundEx(iQuantity * iOriTaxCost, 2);
                //不含税金额 =（含税金额）/（1+税率）
                decimal iOriMoney = 0;
                iOriMoney = Trade.DBUtility.Common.decimalEx.RoundEx(iOriSum / (1 + (iTaxRate / 100)), 2);
                //税额=含税金额-不含税金额
                decimal iOriTaxPrice = iOriSum - iOriMoney;

                //不含税单价
                decimal iOriCost = 0;
                if (iQuantity != 0)
                    iOriCost = Trade.DBUtility.Common.decimalEx.RoundEx(iOriMoney / iQuantity, 2);



                //批次号
                string strcbatch = dtRealFBInstorage.DefaultView[iRow]["SHBacthNo"].ToString();
                int iValidDate = dtRealFBInstorage.DefaultView[iRow]["ValidDate"] == DBNull.Value ? -1 : Convert.ToInt32(dtRealFBInstorage.DefaultView[iRow]["ValidDate"].ToString());
                bool bisNeedDate = false;
                DateTime dtEndDate = new DateTime(1999, 1, 1);
                bisNeedDate = dtRealFBInstorage.DefaultView[iRow]["EndDate"] == DBNull.Value ? false : true;
                if (bisNeedDate)
                    dtEndDate = Convert.ToDateTime(dtRealFBInstorage.DefaultView[iRow]["EndDate"]);
                //
                if (dtRealFBInstorage.DefaultView[iRow]["ValidDate"] != DBNull.Value)
                    iValidDate = Convert.ToInt32(dtRealFBInstorage.DefaultView[iRow]["ValidDate"]);
                //条码行
                DataRow[] drSelectBarCode = null;
                if (bisNeedDate)
                    drSelectBarCode = dsBarCode.Tables[0].Select(" CHNum='" + strCHNum + "' and BatchNo='" + strcbatch + "' and ValidDate='" + iValidDate.ToString() + "'  AND EndDate='" + dtEndDate.ToString() + "'", "BarCode");
                else
                    drSelectBarCode = dsBarCode.Tables[0].Select(" CHNum='" + strCHNum + "' and BatchNo='" + strcbatch + "' and ValidDate IS NULL AND EndDate IS NULL", "BarCode");
                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = AutoID; //主关键字段，int类型
                domBody[iRow]["id"] = ID; //与收发记录主表关联项，int类型
                domBody[iRow]["cinvcode"] = drSelectRowsStock[0]["cinvcode"].ToString(); //存货编码，string类型
                domBody[iRow]["cinvm_unit"] = drSelectRowsStock[0]["cComUnitCode"].ToString();//主计量单位，string类型
                domBody[iRow]["iquantity"] = iQuantity.ToString(); //数量，double类型
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                domBody[iRow]["iMatSettleState"] = "0"; //iMatSettleState，int类型
                //domBody[iRow]["creworkmocode"] = ""; //返工订单号，string类型
                //domBody[iRow]["ireworkmodetailsid"] = ""; //返工订单子表标识，string类型
                //domBody[iRow]["iproducttype"] = ""; //产出品类型，string类型
                //domBody[iRow]["cmaininvcode"] = ""; //对应主产品，string类型
                //domBody[iRow]["imainmodetailsid"] = ""; //主产品订单子表标识，string类型
                //domBody[iRow]["isharematerialfee"] = ""; //分摊材料费，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["idebitids"] = ""; //借入借出单子表id，string类型
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["imergecheckautoid"] = "-1";
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["imergecheckautoid"] = "-1";
                }
                //domBody[iRow]["imergecheckautoid"] = "-1"; //检验单子表ID，string类型
                //
                //domBody[iRow]["outcopiedquantity"] = ""; //已复制数量，string类型
                //domBody[iRow]["iOldPartId"] = ""; //降级前物料编码，string类型
                //domBody[iRow]["fOldQuantity"] = ""; //降级前数量，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["cbmemo"] = "陈亲增测试"; //备注，string类型
                //domBody[iRow]["iFaQty"] = ""; //转资产数量，string类型
                //domBody[iRow]["isTax"] = ""; //累计结算税额，string类型
                domBody[iRow]["irowno"] = (iRow + 1).ToString(); //行号，string类型
                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["cplanlotcode"] = ""; //计划批号，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型
                domBody[iRow]["bgift"] = "0"; //赠品，string类型

                /***************************** 以下是非必输字段 ****************************/
                //domBody[iRow]["cinvaddcode"] = "0102"; //cqz 存货代码，string类型
                //domBody[iRow]["cinvname"] = drSelectRowsStock[0]["品名"].ToString(); //存货名称，string类型
                //domBody[iRow]["cinvstd"] = drSelectRowsStock[0]["规格"].ToString(); //规格型号，string类型
                domBody[iRow]["cinva_unit"] = drSelectRowsStock[0]["cSTComUnitCode"].ToString();//库存单位，string类型
                //domBody[iRow]["bservice"] = ""; //是否费用，string类型
                //domBody[iRow]["cinvccode"] = "0102"; //cqz所属分类码，string类型
                //世宝没有件数
                //if (drSelectRowsStock[0]["iinvexchrate"] == DBNull.Value)
                //    domBody[iRow]["iinvexchrate"] = "0";
                //else
                //    domBody[iRow]["iinvexchrate"] = drSelectRowsStock[0]["iinvexchrate"].ToString(); //换算率，double类型
                //domBody[iRow]["binvbatch"] = ""; //批次管理，string类型
                //世宝没有件数
                //if (drSelectRowsStock[0]["inum"] == DBNull.Value)
                //    domBody[iRow]["inum"] = "0";
                //else
                //    domBody[iRow]["inum"] = drSelectRowsStock[0]["inum"].ToString(); //件数，double类型
                //不知道按供应商送货批号行不行
                if (bInvBatch)
                    domBody[iRow]["cbatch"] = strcbatch; //批号，string类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //属性1，double类型
                //domBody[iRow]["cbatchproperty2"] = ""; //属性2，double类型
                domBody[iRow]["cfree2"] = drSelectRowsStock[0]["cfree2"].ToString(); //存货自由项2，string类型
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["iaprice"] = iOriMoney.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["iaprice"] = iOriMoney.ToString();
                }
                //domBody[iRow]["iaprice"] = strtemp;// "48690.00";// drSelectRowsStock[0]["iOriMoney"].ToString();//"897.44"; //暂估金额，double类型
                //
                //domBody[iRow]["ipunitcost"] = ""; //计划单价/售价，double类型
                //domBody[iRow]["ipprice"] = ""; //计划金额/售价金额，double类型
                if (bInvQuality)
                {
                    //domBody[iRow]["dvdate"] = dtNow.AddMonths(iMassDate).ToString("yyyy-MM-dd"); //失效日期，DateTime类型
                    if (dtEndDate.ToString("yyyy-MM-dd") != "1999-01-01")
                        domBody[iRow]["dvdate"] = dtEndDate.ToString("yyyy-MM-dd"); //失效日期，DateTime类型
                }
                //domBody[iRow]["cvouchcode"] = ""; //对应入库单id，string类型
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["iunitcost"] = iOriCost.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["iunitcost"] = iOriCost.ToString();
                }
                //domBody[iRow]["iunitcost"] = strtemp;// "27.05";// drSelectRowsStock[0]["iOriCost"].ToString();// "89.74"; //本币单价，double类型
                //
                //domBody[iRow]["iflag"] = "0"; //标志，string类型
                //domBody[iRow]["dsdate"] = ""; //结算日期，DateTime类型
                //domBody[iRow]["itax"] = ""; //税额，double类型
                //domBody[iRow]["isnum"] = "0"; //累计结算件数，double类型
                //domBody[iRow]["imoney"] = "0"; //累计结算金额，double类型
                //domBody[iRow]["isoutquantity"] = ""; //累计出库数量，double类型
                //domBody[iRow]["isoutnum"] = ""; //累计出库件数，double类型
                //domBody[iRow]["ifnum"] = ""; //实际件数，double类型
                //domBody[iRow]["ifquantity"] = ""; //实际数量，double类型
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["iprice"] = iOriMoney.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["iprice"] = iOriMoney.ToString();
                }
                //domBody[iRow]["iprice"] = strtemp;//"48690.00";// drSelectRowsStock[0]["iOriMoney"].ToString();// "897.44"; //本币金额，double类型
                //
                //domBody[iRow]["binvtype"] = ""; //折扣类型，string类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["cdefine26"] = ""; //0cqz 表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //0 cqz 表体自定义项6，double类型
                //domBody[iRow]["isquantity"] = "0"; //累计结算数量，double类型
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["iposid"] = drSelectRowsStock[0]["iPosID"].ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["iposid"] = drSelectRowsStock[0]["iPosID"].ToString();
                }
                //domBody[iRow]["iposid"] = strtemp;// drSelectRowsStock[0]["iPosID"].ToString(); //"1000000009"; //订单子表ID，int类型
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["facost"] = iOriCost.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["facost"] = iOriCost.ToString();
                }
                //domBody[iRow]["facost"] = strtemp;//"27.05";// drSelectRowsStock[0]["iOriCost"].ToString();//"89.74"; //暂估单价，double类型
                //
                //domBody[iRow]["citemcode"] = ""; //项目编码，string类型
                //domBody[iRow]["citem_class"] = ""; //项目大类编码，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //属性3，double类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cbatchproperty4"] = ""; //属性4，double类型
                //domBody[iRow]["cbatchproperty5"] = ""; //属性5，double类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cbatchproperty6"] = ""; //属性6，string类型
                domBody[iRow]["cbatchproperty7"] = drSelectRowsStock[0]["cVenName"].ToString(); //属性7，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cbatchproperty8"] = ""; //属性8，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //属性9，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //属性10，DateTime类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                int icdefine34 = -1;
                if (drSelectBarCode.Length > 0)
                {
                    for (int iBarCode = 0; iBarCode < drSelectBarCode.Length; iBarCode++)
                    {
                        string strBarCode = drSelectBarCode[iBarCode]["BarCode"].ToString();
                        DataRow[] drSelectdsInstorage = dsInStorage.Tables["T_CgAppInstorageProduct"].Select("BarCode='" + strBarCode + "'");
                        if (drSelectdsInstorage.Length > 0)
                        {
                            string strInSotragePosCode = drSelectdsInstorage[0]["cPosCode"].ToString();
                            int iStartIndexPos = strInSotragePosCode.IndexOf('(');
                            int iEndIndexPos = strInSotragePosCode.IndexOf(')');
                            if (iStartIndexPos >= 0 && iEndIndexPos > 0 && iEndIndexPos > iStartIndexPos)
                            {
                                strInSotragePosCode = strInSotragePosCode.Substring(iStartIndexPos + 1, iEndIndexPos - iStartIndexPos - 1);
                            }
                            else
                            {
                                strInSotragePosCode = "";
                            }
                            if (strInSotragePosCode == cposition)
                            {
                                icdefine34 = Convert.ToInt32(drSelectdsInstorage[0]["SerialID"]);
                                break;
                            }
                        }
                    }
                }
                domBody[iRow]["cdefine34"] = icdefine34;// dsInStorage.Tables["T_CgAppInstorageProduct"].DefaultView[iRow]["SerialID"].ToString(); //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                domBody[iRow]["inquantity"] = iQuantity.ToString(); //应收数量，double类型
                //
                //if (drSelectRowsStock[0]["inum"] == DBNull.Value)
                //    domBody[iRow]["innum"] = "0"; //应收件数，double类型
                //else
                //    domBody[iRow]["innum"] = drSelectRowsStock[0]["inum"].ToString(); //应收件数，double类型
                //domBody[iRow]["impoids"] = ""; //生产订单子表ID，int类型
                //domBody[iRow]["icheckids"] = ""; //检验单子表ID，int类型
                //
                if (strRKClassName == "委到")
                {
                    domBody[iRow]["iomodid"] = drSelectRowsStock[0]["iPosID"].ToString();
                }
                else if (strRKClassName == "采到")
                {
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["iomodid"] = drSelectRowsStock[0]["iPosID"].ToString();
                }
                else if (strRKClassName == "采检")
                {
                }
                //domBody[iRow]["iomodid"] = strtemp; //委外订单子表ID，int类型
                //
                //domBody[iRow]["isodid"] = ""; //销售订单子表ID，string类型
                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                if (bInvQuality)
                {
                    // domBody[iRow]["imassdate"] =  iMassDate.ToString(); //保质期，int类型
                    domBody[iRow]["imassdate"] = iValidDate; //保质期，int类型
                }
                if (bInvQuality)
                {
                    if (dtEndDate.ToString("yyyy-MM-dd") != "1999-01-01")
                    {
                        if (iValidDate > 0)
                        {
                            iValidDate = 0 - iValidDate;
                            domBody[iRow]["dmadedate"] = dtEndDate.AddDays(iValidDate).ToString("yyyy-MM-dd"); //生产日期，DateTime类型
                        }
                    }
                }
                //domBody[iRow]["cassunit"] = drSelectRowsStock[0]["cSTComUnitCode"].ToString();//"0501"; //库存单位码，string类型
                domBody[iRow]["iarrsid"] = drSelectRowsStock[0]["AutoID"].ToString(); //"1000000039"; //采购到货单子表标识，string类型
                //domBody[iRow]["corufts"] = ""; //时间戳，string类型
                //domBody[iRow]["cposname"] = "AT系列01层02库位"; //货位，string类型
                //domBody[iRow]["cgspstate"] = ""; //检验状态，double类型
                //domBody[iRow]["scrapufts"] = ""; //不合格品时间戳，string类型
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["icheckidbaks"] = drSelectRowsQC[0]["ID"].ToString();
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["icheckidbaks"] = drSelectRowsQC[0]["ID"].ToString();
                }
                //domBody[iRow]["icheckidbaks"] = strtemp; //检验单子表id，string类型
                //
                //domBody[iRow]["irejectids"] = ""; //不良品处理单id，string类型
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["dcheckdate"] = ((DateTime)drSelectRowsQC[0]["ddate"]).ToString("yyyy-MM-dd");
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["dcheckdate"] = ((DateTime)drSelectRowsQC[0]["ddate"]).ToString("yyyy-MM-dd");
                }
                //domBody[iRow]["dcheckdate"] = "2017-09-19"; //检验日期，DateTime类型
                //
                //domBody[iRow]["dmsdate"] = ""; //核销日期，DateTime类型
                if (bInvQuality)
                {
                    domBody[iRow]["cmassunit"] = cMassUnit.ToString(); //保质期单位，int类型
                }
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["ccheckcode"] = drSelectRowsQC[0]["CCHECKCODE"].ToString();
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["ccheckcode"] = drSelectRowsQC[0]["CCHECKCODE"].ToString();
                }
                //domBody[iRow]["ccheckcode"] = ""; //检验单号，string类型
                //
                //domBody[iRow]["crejectcode"] = ""; //不良品处理单号，string类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["cvmivencode"] = ""; //代管商代码，string类型
                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型
                //domBody[iRow]["bvmiused"] = ""; //代管消耗标识，int类型
                //domBody[iRow]["ivmisettlequantity"] = ""; //代管挂账确认单数量，double类型
                //domBody[iRow]["ivmisettlenum"] = ""; //代管挂账确认单件数，double类型
                domBody[iRow]["cbarvcode"] = drSelectRowsStock[0]["cCode"].ToString(); //"0000000017"; //到货单号，string类型
                domBody[iRow]["dbarvdate"] = ((DateTime)drSelectRowsStock[0]["ddate"]).ToString("yyyy-MM-dd");  //到货日期，DateTime类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型
                domBody[iRow]["iordertype"] = "0"; //销售订单类别，int类型
                //domBody[iRow]["iorderdid"] = ""; //iorderdid，int类型
                //domBody[iRow]["iordercode"] = ""; //销售订单号，string类型
                //domBody[iRow]["iorderseq"] = ""; //销售订单行号，string类型
                if (bInvQuality)
                {
                    domBody[iRow]["iexpiratdatecalcu"] = "1"; //有效期推算方式，int类型
                }
                else
                {
                    domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                }
                if (bInvQuality)
                {
                    domBody[iRow]["cexpirationdate"] = dtNow.AddMonths(iMassDate - 1).ToString("yyyy-MM"); //有效期至，string类型
                }
                if (bInvQuality)
                {
                    domBody[iRow]["dexpirationdate"] = dtNow.AddMonths(iMassDate - 1).ToString("yyyy-MM-dd"); //有效期计算项，string类型
                }
                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["ibondedsumqty"] = ""; //累计保税处理抽取数量，string类型
                //domBody[iRow]["iimosid"] = ""; //iimosid，string类型
                //domBody[iRow]["iimbsid"] = ""; //iimbsid，string类型
                //domBody[iRow]["ccheckpersonname"] = ""; //检验员，string类型
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["ccheckpersoncode"] = drSelectRowsQC[0]["ccheckpersoncode"].ToString();
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["ccheckpersoncode"] = drSelectRowsQC[0]["ccheckpersoncode"].ToString();
                }
                //domBody[iRow]["ccheckpersoncode"] = "0241"; //检验员编码，string类型
                //
                domBody[iRow]["cpoid"] = drSelectRowsStock[0]["cordercode"].ToString();// "0000000004"; //订单号，string类型
                //domBody[iRow]["strcontractid"] = drSelectRowsStock[0]["ContractCode"].ToString();//"0000000004"; //合同号，string类型
                //domBody[iRow]["strcode"] = drSelectRowsStock[0]["ContractRowNo"].ToString();// "0102010204"; //合同标的编码，string类型
                //domBody[iRow]["cveninvcode"] = ""; //供应商存货编码，string类型
                //domBody[iRow]["cveninvname"] = ""; //供应商存货名称，string类型
                domBody[iRow]["isotype"] = "0"; //需求跟踪方式，int类型
                //domBody[iRow]["isumbillquantity"] = ""; //累计开票数量，double类型
                //domBody[iRow]["cbaccounter"] = ""; //记账人，string类型
                //
                if (strRKClassName == "委到")
                {
                    domBody[iRow]["bcosting"] = "1";
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["bcosting"] = "0";
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["bcosting"] = "1";
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["bcosting"] = "0";
                }
                //domBody[iRow]["bcosting"] = "1"; //是否核算，string类型
                //
                //domBody[iRow]["impcost"] = ""; //最高进价，string类型
                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["ioritaxcost"] = iOriTaxCost.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["ioritaxcost"] = iOriTaxCost.ToString();
                }
                //domBody[iRow]["ioritaxcost"] = "31.6485";// drSelectRowsStock[0]["iOriTaxCost"].ToString(); //105原币含税单价，double类型

                //
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["ioricost"] = iOriCost.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["ioricost"] = iOriCost.ToString();
                }
                //domBody[iRow]["ioricost"] = "27.05";// drSelectRowsStock[0]["iOriCost"].ToString();// "89.74"; //原币单价，double类型

                //iOriMoney
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["iorimoney"] = iOriMoney.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["iorimoney"] = iOriMoney.ToString();
                }
                //domBody[iRow]["iorimoney"] = "48690.00";// drSelectRowsStock[0]["iOriMoney"].ToString();//"897.44"; //原币金额，double类型

                //iOriTaxPrice
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["ioritaxprice"] = iOriTaxPrice.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["ioritaxprice"] = iOriTaxPrice.ToString();
                }
                //domBody[iRow]["ioritaxprice"] = "8277.30";// drSelectRowsStock[0]["iOriTaxPrice"].ToString(); //"152.56"; //原币税额，double类型

                //iOriSum
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["iorisum"] = iOriSum.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["iorisum"] = iOriSum.ToString();
                }
                //domBody[iRow]["iorisum"] = "56967.30";// drSelectRowsStock[0]["iOriSum"].ToString(); //原币价税合计，double类型

                //
                if (strRKClassName == "委到")
                {
                    domBody[iRow]["itaxrate"] = "0";
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["itaxrate"] = iTaxRate.ToString();
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["itaxrate"] = "0";
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["itaxrate"] = iTaxRate.ToString();
                }
                //domBody[iRow]["itaxrate"] = "17";// drSelectRowsStock[0]["明细税率"].ToString(); //税率，double类型

                //iOriTaxPrice
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["itaxprice"] = iOriTaxPrice.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["itaxprice"] = iOriTaxPrice.ToString();
                }
                //domBody[iRow]["itaxprice"] = "8277.30";// drSelectRowsStock[0]["iOriTaxPrice"].ToString(); //本币税额，double类型

                // iOriSum
                if (strRKClassName == "委到")
                {
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["isum"] = iOriSum.ToString();
                }
                else if (strRKClassName == "委检")
                {
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["isum"] = iOriSum.ToString();
                }
                //domBody[iRow]["isum"] = "56967.30";// drSelectRowsStock[0]["iOriSum"].ToString(); //本币价税合计，double类型

                //
                if (strRKClassName == "委到")
                {
                    domBody[iRow]["btaxcost"] = "0";
                }
                else if (strRKClassName == "采到")
                {
                    domBody[iRow]["btaxcost"] = "1";
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["btaxcost"] = "0";
                }
                else if (strRKClassName == "采检")
                {
                    domBody[iRow]["btaxcost"] = "1";
                }
                //domBody[iRow]["btaxcost"] = "1"; //单价标准，double类型
                //
                //domBody[iRow]["imaterialfee"] = ""; //材料费，double类型

                //
                if (strRKClassName == "委到")
                {
                    domBody[iRow]["iprocesscost"] = iOriCost.ToString();
                }
                else if (strRKClassName == "采到")
                {
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["iprocesscost"] = iOriCost.ToString();
                }
                else if (strRKClassName == "采检")
                {
                }
                //domBody[iRow]["iprocesscost"] = ""; //加工费单价，double类型

                //
                if (strRKClassName == "委到")
                {
                    domBody[iRow]["iprocessfee"] = iOriMoney.ToString();
                }
                else if (strRKClassName == "采到")
                {
                }
                else if (strRKClassName == "委检")
                {
                    domBody[iRow]["iprocessfee"] = iOriMoney.ToString();
                }
                else if (strRKClassName == "采检")
                {
                }
                //domBody[iRow]["iprocessfee"] = ""; //加工费，double类型
                //
                //domBody[iRow]["ismaterialfee"] = ""; //累计结算材料费，double类型
                //domBody[iRow]["isprocessfee"] = ""; //累计结算加工费，double类型
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型
                if (bWhPos)
                    domBody[iRow]["cposition"] = cposition; //货位编码，string类型
                //domBody[iRow]["itrids"] = ""; //特殊单据子表标识，double类型
                //domBody[iRow]["cname"] = ""; //项目名称，string类型
                //domBody[iRow]["citemcname"] = ""; //项目大类名称，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["iinvsncount"] = ""; //存库序列号，int类型
            }
            #endregion
            //broker.AssignNormalValue("domBody", broker.GetBoParam("domBody").ToRSDOM());
            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);
            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return "失败！" + errMsgRet;
            }
            //获取out/inout参数值

            ////获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();

            return "";
            #endregion
        }
        #endregion
        #region 来料报检单API
        /// <summary>
        /// 来料报检单API
        /// </summary>
        /// <param name="strYongYouDBName">UFDATA_999_2014</param>
        /// <param name="sAccID">999</param>
        /// <param name="sYear">2017</param>
        /// <param name="sUserID">demo</param>
        /// <param name="sPassword">demo</param>
        /// <param name="sDate">2017-08-19</param>
        /// <param name="sServer">127.0.0.1</param>
        /// <param name="strSHOrderNum">送货单号</param>
        /// <returns></returns>
        public string YYBJQC(string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strSHOrderNum, string strPDASerialNum, DataSet ds)// List<string> strSerialIDList, List<string> strQtyList)
        {
            DataTable dtSHFBIDAndQty = ds.Tables["T_CGDHProduct"];
            string ss = "";
            //
            if (dtSHFBIDAndQty == null || dtSHFBIDAndQty.DefaultView.Count == 0)
            {
                return "送货单分配表不能为空，请检查!";
            }
            string strWHereSHOrderProductS = "";
            for (int i = 0; i < dtSHFBIDAndQty.DefaultView.Count; i++)
            {
                string strSerialID = dtSHFBIDAndQty.DefaultView[i]["SHSerialID"].ToString().Trim();
                if (strSerialID == string.Empty)
                    continue;
                //
                string strWhereTemp = "SerialID=" + strSerialID;
                if (strWHereSHOrderProductS == "")
                    strWHereSHOrderProductS = strWhereTemp;
                else
                    strWHereSHOrderProductS = strWHereSHOrderProductS + " OR " + strWhereTemp;
            }
            if (strWHereSHOrderProductS.Trim() == "")
            {
                return "strWHereSHOrderProductS条件不能为空，请检查!";
            }
            if (strWHereSHOrderProductS != string.Empty)
            {
                strWHereSHOrderProductS = " (" + strWHereSHOrderProductS + ") ";
            }
            //是否已经做过到货单
            DataSet dsISExistsDHD = new DataSet();
            List<DataTableName> dtnExistsDHDList = new List<DataTableName>();
            //
            DataTableName dtnExistsDHD = new DataTableName();
            dtnExistsDHD.strSelectSQL = "SELECT * FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouch  where isnull(cDefine5,0)='" + ds.Tables["T_CGDH"].DefaultView[0]["ID"].ToString() + "'";
            dtnExistsDHD.strTableName = "PU_ArrivalVouch";
            dtnExistsDHDList.Add(dtnExistsDHD);
            //
            dtnExistsDHD = new DataTableName();
            dtnExistsDHD.strSelectSQL = "SELECT * FROM " + strYongYouDBName + ".dbo.PU_ArrivalVouchS  where id in (select id from " + strYongYouDBName + ".dbo.PU_ArrivalVouch where isnull(cDefine5,0)='" + ds.Tables["T_CGDH"].DefaultView[0]["ID"].ToString() + "')";
            dtnExistsDHD.strTableName = "PU_ArrivalVouchS";

            dtnExistsDHDList.Add(dtnExistsDHD);
            try
            {
                dsISExistsDHD = CustomizableDesignBLL.GetData(dtnExistsDHDList, false);
            }
            catch (Exception ex)
            {
                return "判断送货单号已经做过到货单，出错：" + ex.Message;
            }
            if (dsISExistsDHD == null || dsISExistsDHD.Tables[0].DefaultView.Count == 0)
            {
                return "送货单号还没有做过到货单";
            }
            //判断是否已经搞过了
            string strISExists = "SELECT * FROM " + strYongYouDBName + ".dbo.QMINSPECTVOUCHER where isnull(cDefine5,0)='" + ds.Tables["T_CGDH"].DefaultView[0]["ID"].ToString() + "'";
            DataSet dsISExists = new DataSet();
            try
            {
                dsISExists = CustomizableDesignBLL.GetData(strISExists);
            }
            catch (Exception ex)
            {
                return "判断送货单号已经做过来料报检，出错：" + ex.Message;
            }
            if (dsISExists != null && dsISExists.Tables[0].DefaultView.Count > 0)
            {
                return "送货单号已经做过来料报检";
            }
            //
            DataSet dsSHOrder = new DataSet();
            List<DataTableName> dtnSHList = new List<DataTableName>();
            DataTableName dtnSH = new DataTableName();
            dtnSH.strSelectSQL = "select * from T_SHOrder where isdel=0 and SerialNum='" + strSHOrderNum + "'";
            dtnSH.strTableName = "T_SHOrder";
            dtnSHList.Add(dtnSH);
            //
            dtnSH = new DataTableName();
            dtnSH.strSelectSQL = "select T_SHOrderProduct.*\r\n" +
                                   "from T_SHOrderProduct \r\n" +
                                   " LEFT JOIN " + strYongYouDBName + ".dbo.Inventory Inventory ON T_SHOrderProduct.ProductCode = Inventory.cInvCode\r\n" +
                                   " where isnull(Inventory.bPropertyCheck,0)=1 and \r\n" +
                                   " T_SHOrderProduct.isdel=0 and \r\n" +
                                   " T_SHOrderProduct.SerialNum='" + strSHOrderNum + "' and " + strWHereSHOrderProductS;
            dtnSH.strTableName = "T_SHOrderProduct";
            dtnSHList.Add(dtnSH);
            //
            dtnSH = new DataTableName();
            dtnSH.strSelectSQL = "select T_SHOrderProduct.* from T_SHOrderProduct  where SerialNum='" + strSHOrderNum + "' and " + strWHereSHOrderProductS;
            dtnSH.strTableName = "T_SHOrderProductAll";
            dtnSHList.Add(dtnSH);
            try
            {
                dsSHOrder = CustomizableDesignBLL.GetData(dtnSHList, false);
            }
            catch (Exception ex)
            {
                return "取送货单的数据出错：" + ex.Message;
            }
            if (dsSHOrder.Tables["T_SHOrder"].DefaultView.Count == 0)
            {
                return "送货单号不存在！";
            }
            if (dsSHOrder.Tables["T_SHOrderProductAll"].DefaultView.Count == 0)
            {
                return "送货单明细信息不存在！";
            }
            if (dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count == 0)
            {
                return "";
            }
            dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Sort = "SortID";
            //
            for (int i = 0; i < dtSHFBIDAndQty.DefaultView.Count; i++)
            {
                string strSerialID = dtSHFBIDAndQty.DefaultView[i]["SHSerialID"].ToString().Trim();
                if (strSerialID == string.Empty)
                    continue;
                DataRow[] drSelectRows = dsSHOrder.Tables["T_SHOrderProduct"].Select("SerialID=" + strSerialID);
                if (drSelectRows.Length == 0)
                    continue;
                decimal decQuantity = dtSHFBIDAndQty.DefaultView[i]["Quantity"] == DBNull.Value ? 0 : (decimal)dtSHFBIDAndQty.DefaultView[i]["Quantity"];
                drSelectRows[0]["Quantity"] = decQuantity;
                drSelectRows[0].EndEdit();
            }
            //
            for (int i = 0; i < dtSHFBIDAndQty.DefaultView.Count; i++)
            {
                string strSerialID = dtSHFBIDAndQty.DefaultView[i]["SHSerialID"].ToString().Trim();
                if (strSerialID == string.Empty)
                    continue;
                DataRow[] drSelectRows = dsSHOrder.Tables["T_SHOrderProductAll"].Select("SerialID=" + strSerialID);
                if (drSelectRows.Length == 0)
                    continue;
                decimal decQuantity = dtSHFBIDAndQty.DefaultView[i]["Quantity"] == DBNull.Value ? 0 : (decimal)dtSHFBIDAndQty.DefaultView[i]["Quantity"];
                drSelectRows[0]["Quantity"] = decQuantity;
                drSelectRows[0].EndEdit();
            }
            //string strDetailWhere = "";
            //for (int i = 0; i < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; i++)
            //{
            //    string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["ID"].ToString();
            //    if (strID == string.Empty)
            //        continue;
            //    if (strDetailWhere == "")
            //        strDetailWhere = strID;
            //    else
            //        strDetailWhere = strDetailWhere + " , " + strID;
            //}
            //if (strDetailWhere == "")
            //{
            //    return "送货单明细信息的采购明细/委外订单ID为空！";
            //}
            //
            //DataSet dsStock = new DataSet();
            //List<DataTableName> dtnList = new List<DataTableName>();
            //DataTableName dtn = new DataTableName();
            //dtn.strSelectSQL = "select PO_Pomain.cPOID ,\r\n" +
            //                   " CONVERT(VARCHAR(20), PO_Pomain.cmaketime, 23) 创建日期 ,\r\n" +
            //                   " PO_Podetails.iTax 税额 ,\r\n" +
            //                   " PO_Pomain.POID ,\r\n" +
            //                   " PO_Pomain.cBusType ,\r\n" +
            //                   " PO_Pomain.csccode ,\r\n" +
            //                   " PO_Pomain.cexch_name ,\r\n" +
            //                   " PO_Pomain.itaxrate ,\r\n" +
            //                   " PO_Pomain.nflat ,\r\n" +
            //                   " PO_Pomain.iflowid ,\r\n" +
            //                   " PurchaseType.cPTName ,\r\n" +
            //                   " PO_Podetails.ID DetailID ,\r\n" +
            //                   " hr_hi_person.cPsn_Name ,\r\n" +
            //                   " PO_Pomain.cVenCode 供应商编码 ,\r\n" +
            //                   " PO_Pomain.cdepcode,\r\n" +
            //                   " PO_Pomain.cptcode,\r\n" +
            //                   " PO_Pomain.cpersoncode,\r\n" +
            //                   " Department.cDepName 部门名称 ,\r\n" +
            //                   " vendor.cVenName 供应商名称 ,\r\n" +
            //                   " PO_Podetails.cInvCode 货号 ,\r\n" +
            //                   " inventory.cInvName 品名 ,\r\n" +
            //                   " inventory.cInvStd 规格 ,\r\n" +
            //                   " PO_Podetails.iQuantity 数量 ,\r\n" +
            //                   " PO_Podetails.iUnitPrice 不含税单价,\r\n" +
            //                   " PO_Podetails.iTaxPrice 含税单价,\r\n" +
            //                   " PO_Podetails.iPerTaxRate 税额,\r\n" +
            //                   " PO_Podetails.iNum 件数 ,\r\n" +
            //                   " PO_Podetails.iPerTaxRate,\r\n" +
            //                   " PO_Podetails.btaxcost,\r\n" +
            //                   " PO_Podetails.bgsp,\r\n" +
            //                   " ComputationUnit.cComUnitname 主单位 ,\r\n" +
            //                   " ComputationUnits.ichangrate,\r\n" +
            //                   " ComputationUnits.cComUnitname 辅计量单位 ,\r\n" +
            //                   " PO_Podetails.cFree2 公差 \r\n" +
            //                   " FROM " + strYongYouDBName + ".dbo.PO_Pomain PO_Pomain\r\n" +
            //                   " LEFT JOIN " + strYongYouDBName + ".dbo.PO_Podetails PO_Podetails ON PO_Pomain.POID = PO_Podetails.POID\r\n" +
            //                   " LEFT JOIN " + strYongYouDBName + ".dbo.vendor vendor ON PO_Pomain.cVenCode = vendor.cVenCode\r\n" +
            //                   " LEFT JOIN " + strYongYouDBName + ".dbo.Department Department ON PO_Pomain.cDepCode = Department.cDepCode\r\n" +
            //                   " LEFT JOIN " + strYongYouDBName + ".dbo.PurchaseType PurchaseType ON PO_Pomain.cptcode = PurchaseType.cptcode\r\n" +
            //                   " LEFT JOIN " + strYongYouDBName + ".dbo.Inventory Inventory ON PO_Podetails.cInvCode = Inventory.cInvCode\r\n" +
            //                   " LEFT JOIN " + strYongYouDBName + ".dbo.ComputationUnit ComputationUnit ON Inventory.cComUnitCode = ComputationUnit.cComUnitCode\r\n" +
            //                   " LEFT JOIN " + strYongYouDBName + ".dbo.ComputationUnit ComputationUnits ON Inventory.cSAComUnitCode = ComputationUnits.cComUnitCode\r\n" +
            //                   " LEFT JOIN " + strYongYouDBName + ".dbo.hr_hi_person hr_hi_person ON PO_Pomain.cPersonCode = hr_hi_person.cPsn_Num\r\n" +
            //                    " where isnull(Inventory.bPropertyCheck,0)=1 and PO_Podetails.ID in (" + strDetailWhere + ")";
            //dtn.strTableName = "table_1";
            //dtnList.Add(dtn);
            //try
            //{
            //    dsStock = CustomizableDesignBLL.GetData(dtnList, false);
            //}
            //catch (Exception ex)
            //{
            //    return "取采购订单的数据出错：" + ex.Message;
            //}
            //for (int i = 0; i < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; i++)
            //{
            //    string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["ID"].ToString();
            //    if (dsStock.Tables[0].Select("DetailID='" + strID + "'").Length == 0)
            //    {
            //        return "第" + (i + 1).ToString() + "行相对应的采购订单不存在！";
            //    }
            //}
            #region 来料报检单
            List<DataTableName> dtnMaxList = new List<DataTableName>();
            //
            //DataTableName dtnMaxID = new DataTableName();
            //dtnMaxID.strSelectSQL = "SELECT * FROM ufsystem.dbo.UA_Identity where cvouchtype='OM_MO' and cacc_id='" + Custom.UI.Common.YongYouAccID + "'";
            //dtnMaxID.strTableName = "UA_IdentityOM_MO";
            //dtnMaxList.Add(dtnMaxID);
            ////
            //dtnMaxID = new DataTableName();
            //dtnMaxID.strSelectSQL = "SELECT * FROM ufsystem.dbo.UA_Identity where cvouchtype='OM_Materials' and cacc_id='" + Custom.UI.Common.YongYouAccID + "'";
            //dtnMaxID.strTableName = "UA_IdentityOM_Materials";
            //dtnMaxList.Add(dtnMaxID);
            DataTableName dtnMaxID = new DataTableName();
            dtnMaxID.strSelectSQL = "SELECT max(ID) ID FROM " + strYongYouDBName + ".DBO.QMINSPECTVOUCHER";
            dtnMaxID.strTableName = "QMINSPECTVOUCHER";
            dtnMaxList.Add(dtnMaxID);
            //
            dtnMaxID = new DataTableName();
            dtnMaxID.strSelectSQL = "SELECT max(AutoID) AutoID FROM " + strYongYouDBName + ".DBO.QMINSPECTVOUCHERS";
            dtnMaxID.strTableName = "QMINSPECTVOUCHERS";
            dtnMaxList.Add(dtnMaxID);
            //
            //dtnMaxID = new DataTableName();
            //dtnMaxID.strSelectSQL = "SELECT cnumber " +
            //                        "FROM " + strYongYouDBName + ".DBO.VoucherHistory where cardNumber='qm01'";
            //dtnMaxID.strTableName = "VoucherHistory";
            //dtnMaxList.Add(dtnMaxID);
            //
            DataSet dsUA_Identity = new DataSet();
            try
            {
                dsUA_Identity = CustomizableDesignBLL.GetData(dtnMaxList, false);
            }
            catch (Exception ex)
            {
                return "获取最大的编号出错：" + ex.Message;
            }
            int iFatherId = 0;
            int iChildID = 0;
            if (dsUA_Identity.Tables["QMINSPECTVOUCHER"].DefaultView.Count > 0)
            {
                if (dsUA_Identity.Tables["QMINSPECTVOUCHER"].DefaultView[0]["ID"] == DBNull.Value)
                    iFatherId = 0;
                else
                    iFatherId = Convert.ToInt32(dsUA_Identity.Tables["QMINSPECTVOUCHER"].DefaultView[0]["ID"].ToString());
            }
            if (dsUA_Identity.Tables["QMINSPECTVOUCHERS"].DefaultView.Count > 0)
            {
                if (dsUA_Identity.Tables["QMINSPECTVOUCHERS"].DefaultView[0]["AutoID"] == DBNull.Value)
                    iChildID = 0;
                else
                    iChildID = Convert.ToInt32(dsUA_Identity.Tables["QMINSPECTVOUCHERS"].DefaultView[0]["AutoID"].ToString());
            }
            //
            //string strSavecnumber = "0";
            string strcVouchID = "";
            //if (dsUA_Identity.Tables["VoucherHistory"].DefaultView.Count > 0)
            //{
            //    strSavecnumber = dsUA_Identity.Tables["VoucherHistory"].DefaultView[0]["cnumber"].ToString();
            //}
            //strSavecnumber = (Convert.ToInt32(strSavecnumber) + 1).ToString();
            //strcVouchID = Convert.ToInt32(strSavecnumber).ToString("0000000000");
            //
            List<DataTableName> dtnWWList = new List<DataTableName>();
            DataTableName dtnWW = new DataTableName();
            dtnWW.strSelectSQL = "SELECT * FROM " + strYongYouDBName + ".DBO.QMINSPECTVOUCHER WHERE 1=2 ";
            dtnWW.strTableName = "QMINSPECTVOUCHER";
            dtnWWList.Add(dtnWW);
            //
            dtnWW = new DataTableName();
            dtnWW.strSelectSQL = "SELECT * FROM " + strYongYouDBName + ".DBO.QMINSPECTVOUCHERS WHERE 1=2 ";
            dtnWW.strTableName = "QMINSPECTVOUCHERS";
            dtnWWList.Add(dtnWW);
            //
            string strYearMonth = DateTime.Now.ToString("yyyyMM");
            string strDeptCode = dsISExistsDHD.Tables[0].DefaultView[0]["cDepCode"].ToString();
            string strcSeed = strYearMonth + strDeptCode;
            dtnWW = new DataTableName();
            dtnWW.strSelectSQL = "SELECT * FROM " + strYongYouDBName + ".DBO.VoucherHistory WHERE CardNumber='QM01' and cContent='报检日期|采购/委外部门' and cSeed='" + strcSeed + "'";
            dtnWW.strTableName = "VoucherHistory";
            dtnWWList.Add(dtnWW);
            DataSet dsWW = new DataSet();
            try
            {
                dsWW = CustomizableDesignBLL.GetData(dtnWWList, true);
            }
            catch (Exception ex)
            {
                return "读取来料报检单的表结构出错：" + ex.Message;
            }
            int iMaxnumber = 0;
            if (dsWW.Tables["VoucherHistory"].DefaultView.Count > 0)
            {
                if (dsWW.Tables["VoucherHistory"].DefaultView[0]["cNumber"] != DBNull.Value)
                    iMaxnumber = Convert.ToInt32(dsWW.Tables["VoucherHistory"].DefaultView[0]["cNumber"].ToString());
            }
            iMaxnumber++;
            strcVouchID = DateTime.Now.ToString("yyyyMMdd") + strDeptCode + iMaxnumber.ToString("000");
            if (dsWW.Tables["VoucherHistory"].DefaultView.Count > 0)
            {
                dsWW.Tables["VoucherHistory"].DefaultView[0]["cNumber"] = iMaxnumber;
                dsWW.Tables["VoucherHistory"].DefaultView[0].EndEdit();
            }
            else
            {
                DataRow drNewVoucherHistory = dsWW.Tables["VoucherHistory"].NewRow();
                drNewVoucherHistory["CardNumber"] = "QM01";
                drNewVoucherHistory["cContent"] = "报检日期|采购/委外部门";
                drNewVoucherHistory["cContentRule"] = "月|2";
                drNewVoucherHistory["cSeed"] = strcSeed;
                drNewVoucherHistory["cNumber"] = iMaxnumber.ToString();
                drNewVoucherHistory["bEmpty"] = false;
                dsWW.Tables["VoucherHistory"].Rows.Add(drNewVoucherHistory);
            }
            #region 表头
            DateTime dtNow = DateTime.Now;
            iFatherId++;
            DataRow drNew = dsWW.Tables["QMINSPECTVOUCHER"].NewRow();

            drNew["INSPECTGUID"] = System.Guid.NewGuid().ToString();//报检单Guid  System.Guid.NewGuid().ToString();
            drNew["ID"] = iFatherId;//1 主表id  int
            drNew["CVOUCHTYPE"] = "QM01";//单据类型
            drNew["CINSPECTCODE"] = strcVouchID;//单据编号
            //CREJECTCODE null  不良品处理单单据号  
            drNew["CSOURCECODE"] = dsISExistsDHD.Tables[0].DefaultView[0]["cCode"].ToString();//来源单据单据号 
            //REJECTID null  不良品处理单主表编号  
            drNew["CSOURCEID"] = dsISExistsDHD.Tables[0].DefaultView[0]["ID"] == DBNull.Value ? 0 : (int)dsISExistsDHD.Tables[0].DefaultView[0]["ID"];  //来源单据主表编号  
            //CPOCODE null 采购定单号  
            drNew["DARRIVALDATE"] = dsISExistsDHD.Tables[0].DefaultView[0]["dDate"] == DBNull.Value ? DateTime.Now : (DateTime)dsISExistsDHD.Tables[0].DefaultView[0]["dDate"]; //到货日期  
            drNew["CDEPCODE"] = dsISExistsDHD.Tables[0].DefaultView[0]["cDepCode"].ToString();//部门编码 
            drNew["DDATE"] = dtNow.Date;//报检日期
            drNew["CTIME"] = dtNow.ToString("HH:mm:ss");//报检时间
            drNew["cVenCode"] = dsISExistsDHD.Tables[0].DefaultView[0]["cVenCode"].ToString();//供货单位编码
            drNew["CSOURCE"] = "到货单";//单据来源 
            drNew["IVTID"] = 351;//单据模版号
            //UFTS 不传值
            drNew["CMAKER"] = dsISExistsDHD.Tables[0].DefaultView[0]["CMAKER"].ToString();//报检人
            drNew["CVERIFIER"] = ds.Tables[0].DefaultView[0]["CreaterName"].ToString();//审核人
            //CDEFINE1	自定义项1 
            //CDEFINE2	自定义项2
            //CDEFINE3	自定义项3
            //CDEFINE4	自定义项4
            drNew["CDEFINE5"] = ds.Tables["T_CGDH"].DefaultView[0]["ID"].ToString();//	自定义项5
            //CDEFINE6	自定义项6
            //CDEFINE7	自定义项7
            //CDEFINE8	自定义项8
            //CDEFINE9	自定义项9
            drNew["CDEFINE10"] = strSHOrderNum;// 自定义项10
            //CDEFINE11	自定义项11
            //CDEFINE12	自定义项12
            //CDEFINE13	自定义项13
            //CDEFINE14 自定义项14
            //CDEFINE15	自定义项15
            //CDEFINE16	自定义项16
            //CSOORDERCODE null 销售订单号
            //ISOORDERAUTOID null 销售订单行号
            //IPROORDERID null 生产订单ID
            //CPROORDERCODE null 生产订单号
            //IPROORDERAUTOID null 生产订单行号  
            //CCUSCODE null 客户编码
            //CCONTRACTCODE null 合同编号
            //CCONTRACTSTRCODE null 合同标的号
            //IWORKCENTER null 工作中心ID
            //CPROCESSAUTOID null 工序行号
            //BEXIGENCY null 是否紧急物料

            bool bISWW = false;
            bool bISCG = false;
            for (int i = 0; i < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; i++)
            {
                if (dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["WWOrderNum"].ToString().Trim() == string.Empty && dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["POCode"].ToString().Trim() == string.Empty)
                {
                    return "必须从选择采购订单或者委外订单中选择！";
                }
                if (dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["WWOrderNum"].ToString().Trim() != string.Empty)
                {
                    bISWW = true;
                }
                if (dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["POCode"].ToString().Trim() != string.Empty)
                {
                    bISCG = true;
                }
            }
            if (bISWW && bISCG)
            {
                return "不能同时选择采购订单和委外订单！";
            }
            if (bISCG)
            {
                drNew["CCHECKTYPECODE"] = "ARR";//检验类型编码 ARR-采购检验,SUB--委外检验
            }
            else if (bISWW)
            {
                drNew["CCHECKTYPECODE"] = "SUB";//检验类型编码 ARR-采购检验,SUB--委外检验
            }
            else
            {
                return "必须从选择采购订单或者委外订单中选择CCHECKTYPECODE赋值失败！";
            }
            //
            drNew["CINSPECTDEPCODE"] = dsISExistsDHD.Tables[0].DefaultView[0]["cDepCode"].ToString();//报检部门编码
            //IORDERTYPE null 订单类型
            //drNew["CMODIFIER"] =//修改人
            //drNew["DMODIFYDATE"] =//修改日期
            drNew["DVERIFYDATE"] = dtNow.Date;//审核日期
            drNew["DMAKETIME"] = dtNow.Date;//创建时间
            //drNew["DMODIFYTIME"] =//修改时间
            drNew["DVERIFYTIME"] = dtNow;//审核时间
            drNew["iPrintCount"] = 0;//打印次数
            //CCLEANVER null 卸载版本
            drNew["CSYSBARCODE"] = "||QMLB|" + strcVouchID;	//单据条码 
            //CCHANGER null 变更人
            //DCHANGEDATE null 变更日期
            //DCHANGETIME null 变更时间
            dsWW.Tables["QMINSPECTVOUCHER"].Rows.Add(drNew);
            #endregion
            #region 表体
            for (int i = 0; i < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; i++)
            {
                string strID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["ID"].ToString();
                string strSerialID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["SerialID"].ToString();
                DataRow[] drSelectRowsStock = dsISExistsDHD.Tables["PU_ArrivalVouchS"].Select("cdefine34='" + strSerialID + "'");
                if (drSelectRowsStock.Length == 0)
                {
                    return "第" + (i + 1).ToString() + "行" + dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["ProductCode"].ToString() + "的到货单明细ID找不到";
                }
                iChildID++;
                int iVouchRowNo = 1;
                drNew = dsWW.Tables["QMINSPECTVOUCHERS"].NewRow();

                drNew["ID"] = iFatherId;//1 主表id int		false
                drNew["AUTOID"] = iChildID;//1 子表ID  int		false
                //CITEMCLASS null 项目大类编码
                //CITEMCODE null 项目编码
                //CITEMCNAME null 项目大类名称
                //CITEMNAME null 项目名称
                //REJECTAUTOID null 不良品处理单子表编号
                if (drSelectRowsStock[0]["AutoID"] == DBNull.Value)
                {
                    return "第" + (i + 1).ToString() + "行的到货单明细ID为空";
                }
                else
                {
                    drNew["SOURCEAUTOID"] = (int)drSelectRowsStock[0]["AutoID"];//来源单据子表编号 
                }
                drNew["ITESTSTYLE"] = 2;//检验方式 0-全检,1-免检,2-破坏性抽检,3-非破坏性抽检 
                drNew["CWHCODE"] = drSelectRowsStock[0]["cWhCode"].ToString();//仓库编码
                drNew["CINVCODE"] = drSelectRowsStock[0]["CINVCODE"].ToString();//存货编码
                //CPROBATCH null 生产批产次
                drNew["CBATCH"] = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["BatchNO"].ToString();//批号
                //DPRODATE null 生产日期
                //DVDATE null 失效日期
                drNew["CUNITID"] = drSelectRowsStock[0]["CUNITID"];//辅计量单位编码 
                drNew["FCHANGRATE"] = drSelectRowsStock[0]["iinvexchrate"];//换算率
                drNew["FQUANTITY"] = drSelectRowsStock[0]["iQuantity"];//报检数量
                drNew["FNUM"] = drSelectRowsStock[0]["iNum"];//报检件数
                //BFLAG null 报检单回写标志
                //CFREE1 null 存货自由项1
                drNew["CFREE2"] = drSelectRowsStock[0]["cFree2"]; //存货自由项2
                //CFREE3 null 存货自由项3
                //CFREE4 null 存货自由项4
                //CFREE5 null 存货自由项5
                //CFREE6 null 存货自由项6
                //CFREE7 null 存货自由项7
                //CFREE8 null 存货自由项8
                //CFREE9 null 存货自由项9
                //CFREE10 null 存货自由项10
                //CDEFINE22 null表体自定义项22
                //CDEFINE23 null表体自定义项23
                //CDEFINE24 null表体自定义项24 
                //CDEFINE25 null表体自定义项25 
                //CDEFINE26 null表体自定义项26 
                //CDEFINE27 null表体自定义项27 
                //CDEFINE28 null表体自定义项28 
                //CDEFINE29 null表体自定义项29 
                //CDEFINE30 null表体自定义项30 
                //CDEFINE31 null表体自定义项31 
                //CDEFINE32 null表体自定义项32 
                //CDEFINE33 null表体自定义项33 
                //CDEFINE34 null表体自定义项34 
                //CDEFINE35 null表体自定义项35 
                //CDEFINE36 null表体自定义项36 
                //CDEFINE37 null表体自定义项37 
                //CPOSITION null 没用
                //CBYPRODUCT null 是否产出品
                //IMASSDATE null 保质期
                //CMASSUNIT null 保质期单位
                drNew["IORDERTYPE"] = 0;//需求跟踪方式 0-无来源,1-销售订单行,3-出口订单行,10-全部,4-需求分类代号,5-销售订单号,6-出口订单号  
                //CSOORDERCODE null 需求跟踪号
                //ISOORDERAUTOID null 需求跟踪子表ID 
                //IPROORDERID null 生产订单id
                //CPROORDERCODE null 生产订单号
                //IPROORDERAUTOID null 生产订单行号
                //CCONTRACTCODE null 合同编号
                //CCONTRACTSTRCODE null 合同标的号

                //DataRow[] drS = dsStock.Tables[0].Select("DetailID='" + strID + "'");
                //if (drS.Length == 0)
                //{
                //    return "来料报检单表体的CPOCODE无法找到";
                //}
                //drNew["CPOCODE"] = drS[0]["cPOID"]; //采购/委外订单号 
                drNew["CPOCODE"] = drSelectRowsStock[0]["cordercode"];//采购/委外订单号 
                drNew["BEXIGENCY"] = false;//是否紧急物料 
                //PcsTransType null 工序转换类型
                //CVMIVENCODE null 供应商编码
                //CSOURCEPROORDERCODE null 源生产订单号
                //ISOURCEPROORDERROWNO 源生产订单行号
                //ISOURCEPROORDERID 源生产订单主表ID
                //ISOURCEPROORDERAUTOID 源生产订单子表ID
                drNew["iExpiratDateCalcu"] = 0;//有效期计算方式 0-不推算,1-按月,2-按日
                //cExpirationdate null 有效期至
                //dExpirationdate null 有效期计算项
                //cBatchProperty1 null 批次属性1
                //cBatchProperty2 null 批次属性2
                //cBatchProperty3 null 批次属性3
                //cBatchProperty4 null 批次属性4
                //cBatchProperty5 null 批次属性5
                //cBatchProperty6 null 批次属性6
                //cBatchProperty7 null 批次属性7
                drNew["cBatchProperty8"] = drSelectRowsStock[0]["cBatchProperty8"];//炉号 ，批次属性8
                //cBatchProperty9 null 批次属性9
                //cBatchProperty10 null 批次属性10
                //IORDERDID null 销售订单id 
                drNew["ISOORDERTYPE"] = 0;//订单类型 0-无来源,1-销售订单行,3-出口订单行,10-全部,4-需求分类代号,5-销售订单号,6-出口订单号  
                //CORDERCODE null 销售订单号  
                //IORDERSEQ null 销售订单行号
                //CRETURNREASONCODE null 退货原因编码
                //PFCODE null 流转卡号
                //FSUMCHECKQTY null 累计检验数量
                //FSUMCHECKNUM null 累计检验件数
                drNew["BMERGECHECKFLAG"] = false;// 是否合并检验  
                //CCHECKCODE null 检验单号
                drNew["CBSYSBARCODE"] = "||QMLB|" + strcVouchID + "|" + iVouchRowNo.ToString();//单据行条码 
                //FCVOUCHERCODE null 报工单号报工单号报工单号报工单号  
                //FCVOUCHERSID null 报工单子表ID 报工单子表ID   
                //PLANLOTNUMBER null 计划批号 
                //CDEPCODE null 
                //UFTS null

                dsWW.Tables["QMINSPECTVOUCHERS"].Rows.Add(drNew);
            }
            #endregion
            List<DataTableName> dtnInsertList = new List<DataTableName>();
            foreach (DataTable dt in dsWW.Tables)
            {
                DataRow[] drSelectRows = dt.Select(string.Empty, string.Empty, DataViewRowState.Added);
                if (drSelectRows.Length > 0)
                {
                    string strSQL = "INSERT INTO " + strYongYouDBName + ".DBO." + dt.TableName + " (";
                    string strValue = " SELECT ";
                    foreach (DataColumn dcCol in dt.Columns)
                    {
                        //dcCol.ColumnName.ToLower() == "CWHCODE".ToLower() || 
                        if (dcCol.ColumnName.ToLower() == "Ufts".ToLower() || dcCol.ColumnName.ToLower() == "dUfts".ToLower())
                            continue;
                        if (dcCol.ReadOnly)
                            continue;
                        strSQL += dcCol.ColumnName + ",";
                        strValue += "@" + dcCol.ColumnName + ",";
                    }
                    strSQL = strSQL.Substring(0, strSQL.Length - 1);//去除最后一个逗号
                    strSQL += ")";
                    strValue = strValue.Substring(0, strValue.Length - 1);  //去除最后一个逗号
                    strSQL += strValue;
                    //
                    foreach (DataRow drRow in drSelectRows)
                    {
                        DataTableName dtnInsert = new DataTableName();
                        dtnInsert.strExecSQL = strSQL;
                        foreach (DataColumn dcCol in dt.Columns)
                        {
                            //dcCol.ColumnName.ToLower() == "CWHCODE".ToLower() || 
                            if (dcCol.ColumnName.ToLower() == "Ufts".ToLower() || dcCol.ColumnName.ToLower() == "dUfts".ToLower())
                                continue;
                            if (dcCol.ReadOnly)
                                continue;
                            dtnInsert.SqlExecParameterList.Add(new System.Data.SqlClient.SqlParameter("@" + dcCol.ColumnName, drRow[dcCol.ColumnName, DataRowVersion.Current]));
                        }
                        dtnInsertList.Add(dtnInsert);
                    }
                }
            }
            //DataTableName dtnUpdateID = new DataTableName();
            //dtnUpdateID.strExecSQL = "UPDATE ufsystem.dbo.UA_Identity  SET iFatherId=" + iFatherId.ToString() + ",iChildID=" + iChildID.ToString() + " where cvouchtype='OM_MO' and cacc_id='" + Custom.UI.Common.YongYouAccID + "'";
            //dtnInsertList.Add(dtnUpdateID);
            ////
            //DataTableName dtnUpdateID2 = new DataTableName();
            //dtnUpdateID2.strExecSQL = "UPDATE ufsystem.dbo.UA_Identity  SET iFatherId=" + iChildID.ToString() + ",iChildID=" + iChild2ID.ToString() + " where cvouchtype='OM_Materials' and cacc_id='" + Custom.UI.Common.YongYouAccID + "'";
            //dtnInsertList.Add(dtnUpdateID2);
            //
            //DataTableName dtnVoucherHistory = new DataTableName();
            //dtnVoucherHistory.strExecSQL = "UPDATE " + strYongYouDBName + ".DBO.VoucherHistory SET cnumber=" + strSavecnumber + " where cardNumber='OM01'";
            //dtnInsertList.Add(dtnVoucherHistory);
            //刷到货单的累计检验数量、累计检验件数
            for (int i = 0; i < dsSHOrder.Tables["T_SHOrderProduct"].DefaultView.Count; i++)
            {
                string strSerialID = dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["SerialID"].ToString();
                DataRow[] drSelectRowsStock = dsISExistsDHD.Tables["PU_ArrivalVouchS"].Select("cdefine34='" + strSerialID + "'");
                if (drSelectRowsStock.Length == 0)
                {
                    return "第" + (i + 1).ToString() + "行" + dsSHOrder.Tables["T_SHOrderProduct"].DefaultView[i]["ProductCode"].ToString() + "的到货单明细ID找不到";
                }
                int iAutoID = 0;
                if (drSelectRowsStock[0]["AutoID"] == DBNull.Value)
                {
                    return "第" + (i + 1).ToString() + "行的到货单明细ID为空";
                }
                else
                {
                    iAutoID = (int)drSelectRowsStock[0]["AutoID"];
                }
                decimal deciQuantity = drSelectRowsStock[0]["iQuantity"] == DBNull.Value ? 0 : (decimal)drSelectRowsStock[0]["iQuantity"];//报检数量
                decimal deciNum = drSelectRowsStock[0]["iNum"] == DBNull.Value ? 0 : (decimal)drSelectRowsStock[0]["iNum"];//报检件数
                DataTableName dtnUpdatefInspectQty = new DataTableName();
                dtnUpdatefInspectQty.strExecSQL = "UPDATE " + strYongYouDBName + ".DBO.PU_ArrivalVouchs SET bInspect=1, fInspectQuantity=" + deciQuantity.ToString() + ",fInspectNum=" + deciNum.ToString() + " where AutoID=" + iAutoID.ToString();
                dtnInsertList.Add(dtnUpdatefInspectQty);
            }
            DataTableName.ExecAfterSQL sql1 = new DataTableName.ExecAfterSQL();
            sql1.strSQL = "update " + strYongYouDBName + ".dbo.QMINSPECTVOUCHER \r\n" +
                            "set CMAKER=(select top 1 cUser_Name from UFSystem.dbo.UA_User where cuser_id='" + sUserID + "')\r\n" +
                                "where isnull(cDefine10,'')='" + strSHOrderNum + "'";
            dtnInsertList[0].ExecAfterSQLList.Add(sql1);
            try
            {
                CustomizableDesignBLL.ExecSQL(dtnInsertList);
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            #endregion
            return "";
        }
        #endregion

        #region 中天产成品入库API11
        public string CPInStorage(DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strPKValue)
        {
            if (ds.Tables[0].DefaultView.Count == 0)
            {
                return "成品入库单据不能为空";
            }
            //判断是否已经搞过了 
            string strSerialNum = ds.Tables[0].DefaultView[0]["SerialNum"].ToString();
            string strISExists = "SELECT * FROM " + strYongYouDBName + ".dbo.rdrecord10 where isnull(cDefine10,'')='" + strSerialNum + "'";
            DataSet dsISExists = new DataSet();
            try
            {
                dsISExists = CustomizableDesignBLL.GetData(strISExists);
            }
            catch (Exception ex)
            {
                return "判断号已经做过入库单，出错：" + ex.Message;
            }
            if (dsISExists != null && dsISExists.Tables[0].DefaultView.Count > 0)
            {
                return "单号已经做过入库单";
            }
            //获取仓库和仓库代码
            string strStorageName = ds.Tables[0].DefaultView[0]["cWhName"].ToString();
            string strcwhcode = "";
            string strcwhname = "";
            int iStartIndex = strStorageName.IndexOf('(');
            int iEndIndex = strStorageName.IndexOf(')');
            if (iStartIndex >= 0 && iEndIndex > 0 && iEndIndex > iStartIndex)
            {
                strcwhcode = strStorageName.Substring(iStartIndex + 1, iEndIndex - iStartIndex - 1);
                strcwhname = strStorageName.Substring(iEndIndex + 1, strStorageName.Length - iEndIndex - 1);
            }
            //
            #region 获取存货是否批次管理
            string strProductCodeWhere = string.Empty;
            string strSCDetailIDWhere = string.Empty;
            for (int iRow = 0; iRow < ds.Tables["T_CPRKProduct"].DefaultView.Count; iRow++)
            {
                string strProductCode = ds.Tables["T_CPRKProduct"].DefaultView[iRow]["ProductCode"].ToString(); //材料编码，string类型
                //
                if (strProductCodeWhere == string.Empty)
                {
                    strProductCodeWhere = "'" + strProductCode + "'";
                }
                else
                {
                    strProductCodeWhere = strProductCodeWhere + ",'" + strProductCode + "'";
                }
                //
                string strSCDetailID = ds.Tables["T_CPRKProduct"].DefaultView[iRow]["SCDetailID"].ToString();
                if (strSCDetailIDWhere == string.Empty)
                {
                    strSCDetailIDWhere = "'" + strSCDetailID + "'";
                }
                else
                {
                    strSCDetailIDWhere = strSCDetailIDWhere + ",'" + strSCDetailID + "'";
                }
            }
            if (!string.IsNullOrEmpty(strProductCodeWhere))
                strProductCodeWhere = " where cinvcode in (" + strProductCodeWhere + ")";
            else
                strProductCodeWhere = " where 1=2 ";
            //
            if (!string.IsNullOrEmpty(strSCDetailIDWhere))
                strSCDetailIDWhere = " where MoDId in (" + strSCDetailIDWhere + ")";
            else
                strSCDetailIDWhere = " where 1=2 ";
            //
            DataSet dsCKAndPC = new DataSet();
            List<DataTableName> dtnCKAndPCList = new List<DataTableName>();
            //
            DataTableName dtnCKAndPC = new DataTableName();
            dtnCKAndPC.strSelectSQL = "select *,(select top 1 ichangrate from " + strYongYouDBName + ".DBO.ComputationUnit  where cComUnitCode=Inventory.cSAComUnitCode ) ichangrate  from " + strYongYouDBName + ".dbo.inventory inventory " + strProductCodeWhere;
            dtnCKAndPC.strTableName = "inventory";
            dtnCKAndPCList.Add(dtnCKAndPC);
            //
            dtnCKAndPC = new DataTableName();
            dtnCKAndPC.strSelectSQL = "select *  from " + strYongYouDBName + ".dbo.Warehouse where cWhCode='" + strcwhcode + "'";
            dtnCKAndPC.strTableName = "Warehouse";
            dtnCKAndPCList.Add(dtnCKAndPC);
            //
            dtnCKAndPC = new DataTableName();
            dtnCKAndPC.strSelectSQL = "select top 1 *  from " + strYongYouDBName + ".dbo.rdrecord10";
            dtnCKAndPC.strTableName = "rdrecord10";
            dtnCKAndPCList.Add(dtnCKAndPC);
            //
            dtnCKAndPC = new DataTableName();
            dtnCKAndPC.strSelectSQL = "select *  from " + strYongYouDBName + ".dbo.mom_orderdetail " + strSCDetailIDWhere;
            dtnCKAndPC.strTableName = "mom_orderdetail";
            dtnCKAndPCList.Add(dtnCKAndPC);
            //
            try
            {
                dsCKAndPC = CustomizableDesignBLL.GetData(dtnCKAndPCList, false);
            }
            catch (Exception ex)
            {
                return "获取存货信息失败，原因：" + ex.Message;
            }
            #endregion
            //先合拼数据，按生产订单明细ID+批号+有效期+货位
            List<string> strSCOrderList = new List<string>();
            List<string> strSCIDList = new List<string>();
            List<string> strSCDetailIDList = new List<string>();
            List<string> strBatchNoList = new List<string>();
            List<string> strTMCreateTimeList = new List<string>();
            List<string> strVailDateList = new List<string>();
            List<string> strgoodAddressList = new List<string>();
            ds.Tables["T_CPRKProduct"].DefaultView.Sort = "SortID";
            for (int i = 0; i < ds.Tables["T_CPRKProduct"].DefaultView.Count; i++)
            {
                string strSCOrder = ds.Tables["T_CPRKProduct"].DefaultView[i]["SCOrder"].ToString();
                string strSCID = ds.Tables["T_CPRKProduct"].DefaultView[i]["SCID"].ToString();
                string strSCDetailID = ds.Tables["T_CPRKProduct"].DefaultView[i]["SCDetailID"].ToString();
                string strBatchNo = ds.Tables["T_CPRKProduct"].DefaultView[i]["BatchNo"].ToString();
                //
                string strVailDate = "";
                if (ds.Tables["T_CPRKProduct"].DefaultView[i]["VailDate"] != DBNull.Value)
                    strVailDate = ((DateTime)ds.Tables["T_CPRKProduct"].DefaultView[i]["VailDate"]).ToString("yyyy-MM-dd");
                //
                string strTMCreateTime = "";
                if (ds.Tables["T_CPRKProduct"].DefaultView[i]["TMCreateTime"] != DBNull.Value)
                    strTMCreateTime = ((DateTime)ds.Tables["T_CPRKProduct"].DefaultView[i]["TMCreateTime"]).ToString("yyyy-MM-dd");
                //
                string strgoodAddress = ds.Tables["T_CPRKProduct"].DefaultView[i]["goodAddress"].ToString();
                bool bISExists = false;
                for (int j = 0; j < strSCDetailIDList.Count; j++)
                {
                    if (strSCOrderList[j].ToLower() == strSCOrder.ToLower() && strSCIDList[j].ToLower() == strSCID.ToLower() && strSCDetailIDList[j].ToLower() == strSCDetailID.ToLower() && strBatchNoList[j].ToLower() == strBatchNo.ToLower() && strVailDateList[j].ToLower() == strVailDate.ToLower() && strTMCreateTimeList[j].ToLower() == strTMCreateTime.ToLower() && strgoodAddressList[j].ToLower() == strgoodAddress.ToLower())
                    {
                        bISExists = true;
                        break;
                    }
                }
                if (!bISExists)
                {
                    strSCOrderList.Add(strSCOrder);
                    strSCIDList.Add(strSCID);
                    strSCDetailIDList.Add(strSCDetailID);
                    strBatchNoList.Add(strBatchNo);
                    strVailDateList.Add(strVailDate);
                    strTMCreateTimeList.Add(strTMCreateTime);
                    strgoodAddressList.Add(strgoodAddress);
                }
            }
            if (strSCOrderList.Count == 0)
            {
                return "生产订单集为空";
            }

            string strResult = string.Empty;
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_997_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                return "登陆失败，原因：" + u8Login.ShareString;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/ProductIn/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ProductIn/Add");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：10
            broker.AssignNormalValue("sVouchType", "10");

            //给BO表头参数DomHead赋值，此BO参数的业务类型为产成品入库单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            if (dsCKAndPC.Tables["rdrecord10"].DefaultView.Count == 0)
                DomHead[0]["ccode"] = "0000000001"; //入库单号，string类型
            else
                DomHead[0]["ccode"] = dsCKAndPC.Tables["rdrecord10"].DefaultView[0]["cCode"].ToString(); //入库单号，string类型
            DomHead[0]["ddate"] = sDate; //入库日期，DateTime类型
            DomHead[0]["cwhname"] = strcwhname; //仓库，string类型
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            ////DomHead[0]["dchkdate"] = ""; //检验日期，DateTime类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["cpspcode"] = ""; //产品，string类型
            DomHead[0]["iproorderid"] = strSCIDList[0];//"1000000133"; //生产订单ID，string类型
            DomHead[0]["cmpocode"] = strSCOrderList[0];// "18SCDD09001-4"; //生产订单号，string类型
            //DomHead[0]["cprobatch"] = ""; //生产批号，string类型
            DomHead[0]["iverifystate"] = "0"; //iverifystate，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，string类型
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            //DomHead[0]["cdepname"] = ""; //部门，string类型
            //DomHead[0]["crdname"] = ""; //入库类别，string类型
            //DomHead[0]["dveridate"] = ""; //审核日期，DateTime类型
            DomHead[0]["cmemo"] = "PDA生成"; //备注，string类型
            //DomHead[0]["cchkperson"] = ""; //检验员，string类型
            DomHead[0]["cmaker"] = ds.Tables[0].DefaultView[0]["CreaterName"].ToString(); ; //制单人，string类型
            //DomHead[0]["chandler"] = ""; //审核人，string类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型
            DomHead[0]["cbustype"] = "成品入库"; //业务类型，int类型
            //DomHead[0]["cpersonname"] = ""; //业务员，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            DomHead[0]["csource"] = "生产订单"; //单据来源，int类型
            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            DomHead[0]["brdflag"] = "1"; //收发标志，string类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            DomHead[0]["cdefine10"] = strPKValue; //表头自定义项10，string类型
            DomHead[0]["cvouchtype"] = "10"; //单据类型，string类型
            DomHead[0]["cwhcode"] = strcwhcode;// "30"; //仓库编码，string类型
            string strInorout = ds.Tables[0].DefaultView[0]["RKType"].ToString();
            string strcrdcode = "";
            //int iCRDStartIndex = strInorout.IndexOf('(');
            //int iCRDIndex = strInorout.IndexOf(')');
            LogWritMsg(strInorout);
            //if (iCRDStartIndex >= 0 && iCRDIndex > 0 && iCRDIndex > iCRDStartIndex)
            //{
            //    strcrdcode = strInorout.Substring(iCRDStartIndex + 1, iEndIndex - iCRDStartIndex - 1);
            //}

            strcrdcode = GetwhOrPoCodeAndName(strInorout, 0);

            DomHead[0]["crdcode"] = strcrdcode;// "12"; //入库类别编码，string类型
            DomHead[0]["cdepcode"] = ds.Tables["T_CPRKProduct"].DefaultView[0]["DeptCode"].ToString();//"01"; //部门编码，string类型
            //DomHead[0]["cpersoncode"] = ""; //业务员编码，string类型
            DomHead[0]["vt_id"] = "63"; //模版号，int类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型

            //给BO表体参数domBody赋值，此BO参数的业务类型为产成品入库单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = strSCDetailIDList.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            for (int iRow = 0; iRow < strSCDetailIDList.Count; iRow++)
            {
                string strInvCode = "";
                decimal decSumQuantity = 0;
                string strSortSeq = "";
                //日期类型为空的时候不好过滤，所以这里写了循环
                foreach (DataRowView drv in ds.Tables["T_CPRKProduct"].DefaultView)
                {
                    string strSCOrder = drv["SCOrder"].ToString();
                    string strSCID = drv["SCID"].ToString();
                    string strSCDetailID = drv["SCDetailID"].ToString();
                    string strBatchNo = drv["BatchNo"].ToString();
                    string strVailDate = "";
                    if (drv["VailDate"] != DBNull.Value)
                        strVailDate = ((DateTime)drv["VailDate"]).ToString("yyyy-MM-dd");
                    //
                    string strTMCreateTime = "";
                    if (drv["TMCreateTime"] != DBNull.Value)
                        strTMCreateTime = ((DateTime)drv["TMCreateTime"]).ToString("yyyy-MM-dd");
                    string strgoodAddress = drv["goodAddress"].ToString();
                    //
                    decimal decQuantity = drv["Quantity"] == DBNull.Value ? 0 : (decimal)drv["Quantity"];
                    if (strSCOrderList[iRow].ToLower() == strSCOrder.ToLower() && strSCIDList[iRow].ToLower() == strSCID.ToLower() && strSCDetailIDList[iRow].ToLower() == strSCDetailID.ToLower() && strBatchNoList[iRow].ToLower() == strBatchNo.ToLower() && strVailDateList[iRow].ToLower() == strVailDate.ToLower() && strTMCreateTimeList[iRow].ToLower() == strTMCreateTime.ToLower() && strgoodAddressList[iRow].ToLower() == strgoodAddress.ToLower())
                    {
                        strInvCode = drv["ProductCode"].ToString();
                        decSumQuantity = decSumQuantity + decQuantity;
                        //
                        DataRow[] drSelectRows = dsCKAndPC.Tables["mom_orderdetail"].Select("modid=" + strSCDetailID);
                        if (drSelectRows.Length == 0)
                        {
                            return "生产订单明细" + strSCDetailID + "不存在";
                        }
                        strSortSeq = drSelectRows[0]["SortSeq"].ToString();
                    }
                }
                DataRow[] drSelectRowsInventory = dsCKAndPC.Tables["inventory"].Select("cinvcode='" + strInvCode + "'");
                if (drSelectRowsInventory.Length == 0)
                {
                    return "货号" + strInvCode + "在U8中不存在!";
                }
                decimal iinvexchrate = 0;//换算率，double类型
                if (drSelectRowsInventory[0]["ichangrate"] == DBNull.Value)
                    iinvexchrate = 0;
                else
                    iinvexchrate = Convert.ToDecimal(drSelectRowsInventory[0]["ichangrate"].ToString());
                decimal decinum = iinvexchrate == 0 ? decSumQuantity : Trade.DBUtility.Common.decimalEx.RoundEx(decSumQuantity / iinvexchrate, 2);//件数
                bool bInvBatch = drSelectRowsInventory[0]["bInvBatch"] == DBNull.Value ? false : (bool)drSelectRowsInventory[0]["bInvBatch"];
                bool bInvQuality = drSelectRowsInventory[0]["bInvQuality"] == DBNull.Value ? false : (bool)drSelectRowsInventory[0]["bInvQuality"];
                int iMassDate = drSelectRowsInventory[0]["iMassDate"] == DBNull.Value ? 0 : Convert.ToInt32(drSelectRowsInventory[0]["iMassDate"].ToString());
                int cMassUnit = drSelectRowsInventory[0]["cMassUnit"] == DBNull.Value ? 0 : Convert.ToInt32(drSelectRowsInventory[0]["cMassUnit"].ToString());

                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = "0"; //主关键字段，int类型
                domBody[iRow]["cinvcode"] = strInvCode;// "01019002065"; //产品编码，string类型
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                //domBody[iRow]["ccheckcode"] = ""; //检验单号，string类型
                //domBody[iRow]["icheckidbaks"] = ""; //检验单子表id，string类型
                //domBody[iRow]["crejectcode"] = ""; //不良品处理单号，string类型
                //domBody[iRow]["irejectids"] = ""; //不良品处理单id，string类型
                //domBody[iRow]["ccheckpersonname"] = ""; //检验员，string类型
                //domBody[iRow]["dcheckdate"] = ""; //检验日期，string类型
                //domBody[iRow]["ccheckpersoncode"] = ""; //检验员编码，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["outcopiedquantity"] = ""; //已复制数量，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["cbmemo"] = ""; //备注，string类型
                domBody[iRow]["irowno"] = (iRow + 1).ToString(); //行号，string类型
                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["cservicecode"] = ""; //服务单号，string类型
                //domBody[iRow]["cplanlotcode"] = ""; //计划批号，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型
                //domBody[iRow]["iinvsncount"] = ""; //已指定序列号量，string类型

                /***************************** 以下是非必输字段 ****************************/
                domBody[iRow]["id"] = "0"; //与主表关联项，int类型
                //domBody[iRow]["cinvaddcode"] = ""; //产品代码，string类型
                //domBody[iRow]["cinvname"] = ""; //产品名称，string类型
                //domBody[iRow]["cinvstd"] = ""; //规格型号，string类型
                domBody[iRow]["cinvm_unit"] = drSelectRowsInventory[0]["cComUnitCode"].ToString(); //主计量单位，string类型
                //domBody[iRow]["cinva_unit"] = ""; //库存单位，string类型
                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型
                bool bWhPos = dsCKAndPC.Tables["Warehouse"].DefaultView[0]["bWhPos"] == DBNull.Value ? false : (bool)dsCKAndPC.Tables["Warehouse"].DefaultView[0]["bWhPos"];
                if (bWhPos)
                {
                    string strgoodAddress = strgoodAddressList[iRow];
                    string strcposition = "";
                    //iCRDStartIndex = strgoodAddress.IndexOf('(');
                    //iCRDIndex = strgoodAddress.IndexOf(')');
                    //if (iCRDStartIndex >= 0 && iCRDIndex > 0 && iCRDIndex > iCRDStartIndex)
                    //{
                    //    strcposition = strgoodAddress.Substring(iCRDStartIndex + 1, iCRDIndex - iCRDStartIndex - 1);
                    //}
                    strcposition = GetwhOrPoCodeAndName(strgoodAddress, 0);
                    domBody[iRow]["cposition"] = strcposition; //货位编码，string类型
                }
                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，double类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，double类型
                //domBody[iRow]["cfree2"] = ""; //存货自由项2，string类型
                if (bInvBatch)
                {
                    domBody[iRow]["cbatch"] = strBatchNoList[iRow]; //批号，string类型
                }
                if (iinvexchrate != 0)
                    domBody[iRow]["iinvexchrate"] = ""; //换算率，double类型
                if (iinvexchrate != 0)
                    domBody[iRow]["inum"] = ""; //件数，double类型
                domBody[iRow]["iquantity"] = decSumQuantity.ToString(); //数量，double类型
                //domBody[iRow]["iunitcost"] = ""; //单价，double类型
                //domBody[iRow]["iprice"] = ""; //金额，double类型
                //domBody[iRow]["ipunitcost"] = ""; //计划单价，double类型
                //domBody[iRow]["ipprice"] = ""; //计划金额，double类型
                if (bInvQuality)
                {
                    DateTime dtDate = DateTime.Now;
                    try
                    {
                        dtDate = Convert.ToDateTime(strVailDateList[iRow]);
                    }
                    catch (Exception ex)
                    {
                        return "日期格式：" + strVailDateList[iRow] + "不对";
                    }
                    domBody[iRow]["dvdate"] = dtDate.ToString("yyyy-MM-dd"); //失效日期，DateTime类型
                }
                //domBody[iRow]["isoutquantity"] = ""; //累计出库数量，double类型
                //domBody[iRow]["isoutnum"] = ""; //累计出库件数，double类型
                //domBody[iRow]["dsdate"] = ""; //结算日期，DateTime类型
                //domBody[iRow]["ifquantity"] = ""; //实际数量，double类型
                //domBody[iRow]["ifnum"] = ""; //实际件数，double类型
                //domBody[iRow]["cvouchcode"] = ""; //对应入库单id，string类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，double类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，double类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，double类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型
                //domBody[iRow]["cbatchproperty8"] = ""; //批次属性8，string类型
                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，DateTime类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型
                //domBody[iRow]["inquantity"] = "123"; //应收数量，double类型 cqz
                //domBody[iRow]["innum"] = ""; //应收件数，double类型
                if (bInvQuality)
                {
                    DateTime dtDate = DateTime.Now;
                    try
                    {
                        dtDate = Convert.ToDateTime(strTMCreateTimeList[iRow]);
                    }
                    catch (Exception ex)
                    {
                        return "日期格式：" + strTMCreateTimeList[iRow] + "不对";
                    }
                    domBody[iRow]["dmadedate"] = dtDate.ToString("yyyy-MM-dd"); //生产日期，DateTime类型
                }
                domBody[iRow]["impoids"] = strSCDetailIDList[iRow];//"1000000233"; //生产订单子表ID，int类型
                //domBody[iRow]["icheckids"] = ""; //检验单子表ID，int类型
                //domBody[iRow]["isodid"] = ""; //销售订单子表ID，string类型
                //domBody[iRow]["brelated"] = ""; //是否联副产品，int类型
                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                if (bInvQuality)
                {
                    domBody[iRow]["imassdate"] = iMassDate.ToString(); //保质期，int类型
                }
                //domBody[iRow]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["cposname"] = ""; //货位，string类型
                //domBody[iRow]["cmolotcode"] = ""; //生产批号，string类型
                if (bInvQuality)
                {
                    domBody[iRow]["cmassunit"] = cMassUnit.ToString(); //保质期单位，int类型
                }
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                domBody[iRow]["cmocode"] = strSCOrderList[iRow];//"18SCDD09001-4"; //生产订单号，string类型
                //domBody[iRow]["cvmivencode"] = ""; //代管商代码，string类型
                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型
                //domBody[iRow]["bvmiused"] = ""; //代管消耗标识，int类型
                //domBody[iRow]["ivmisettlequantity"] = ""; //代管挂账确认单数量，double类型
                //domBody[iRow]["ivmisettlenum"] = ""; //代管挂账确认单件数，double类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型

                //domBody[iRow]["iordertype"] = ""; //销售订单类别，int类型
                //domBody[iRow]["iorderdid"] = ""; //iorderdid，int类型
                //domBody[iRow]["iordercode"] = ""; //销售订单号，string类型
                //domBody[iRow]["iorderseq"] = ""; //销售订单行号，string类型
                if (bInvQuality)
                {
                    domBody[iRow]["iexpiratdatecalcu"] = "1"; //有效期推算方式，int类型
                }
                else
                {
                    domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                }
                if (bInvQuality)
                {
                    DateTime dtDate = DateTime.Now;
                    try
                    {
                        dtDate = Convert.ToDateTime(strVailDateList[iRow]);
                    }
                    catch (Exception ex)
                    {
                        return "日期格式：" + strVailDateList[iRow] + "不对";
                    }
                    domBody[iRow]["cexpirationdate"] = dtDate.ToString("yyyy-MM"); //有效期至，string类型
                }
                if (bInvQuality)
                {
                    DateTime dtDate = DateTime.Now;
                    try
                    {
                        dtDate = Convert.ToDateTime(strVailDateList[iRow]);
                    }
                    catch (Exception ex)
                    {
                        return "日期格式：" + strVailDateList[iRow] + "不对";
                    }
                    domBody[iRow]["dexpirationdate"] = dtDate.ToString("yyyy-MM-dd"); //有效期计算项，string类型
                }
                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["ibondedsumqty"] = ""; //累计保税处理抽取数量，string类型
                //domBody[iRow]["copdesc"] = ""; //工序说明，string类型
                //domBody[iRow]["cmworkcentercode"] = ""; //工作中心编码，string类型
                //domBody[iRow]["cmworkcenter"] = ""; //工作中心，string类型
                //domBody[iRow]["isotype"] = ""; //需求跟踪方式，int类型
                //domBody[iRow]["cbaccounter"] = ""; //记账人，string类型
                //domBody[iRow]["bcosting"] = ""; //是否核算，string类型
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                domBody[iRow]["imoseq"] = strSortSeq; //生产订单行号，string类型
                //domBody[iRow]["iopseq"] = ""; //工序行号，string类型
                //domBody[iRow]["cdefine34"] = ""; //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["itrids"] = ""; //特殊单据子表标识，double类型
                //domBody[iRow]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //表体自定义项6，double类型
                //domBody[iRow]["citemcode"] = ""; //项目编码，string类型
                //domBody[iRow]["cname"] = ""; //项目，string类型
                //domBody[iRow]["citem_class"] = ""; //项目大类编码，string类型
                //domBody[iRow]["citemcname"] = ""; //项目大类名称，string类型
            }
            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExceptionMsg = "";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExceptionMsg = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExceptionMsg = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExceptionMsg = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExceptionMsg;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return "失败！" + errMsgRet;
            }
            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return "";
        }
        #endregion
        #region 中天产成品入库审核API
        public string CPInStorageAudit(ADODB.Connection oCon, DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {
            if (ds.Tables[0].DefaultView.Count == 0)
            {
                return "成品入库单据不能为空";
            }

            string strResult = string.Empty;
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_997_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                return "登录失败，原因：" + u8Login.ShareString;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/ProductIn/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ProductIn/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：10
            broker.AssignNormalValue("sVouchType", "10");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", ds.Tables[0].DefaultView[0]["ID"].ToString());


            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            broker.AssignNormalValue("cnnFrom", oCon);

            //给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", ds.Tables[0].DefaultView[0]["ufts1"]);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            //给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            //给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            //给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());

            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String errMsgRet = broker.GetResult("errMsg") as System.String;
            if (result == false)
            {
                //结束本次调用，释放API资源
                broker.Release();
                return "错误" + errMsgRet;
            }
            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return "";
        }
        public string CPInStorageAudit(ADODB.Connection oCon, string id, string utfs1, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {

            string strResult = string.Empty;
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_997_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                return "登录失败，原因：" + u8Login.ShareString;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/ProductIn/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ProductIn/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：10
            broker.AssignNormalValue("sVouchType", "10");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", id);


            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            broker.AssignNormalValue("cnnFrom", oCon);

            //给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", utfs1);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            //给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            //给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            //给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());

            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String errMsgRet = broker.GetResult("errMsg") as System.String;
            if (result == false)
            {
                //结束本次调用，释放API资源
                broker.Release();
                return "错误" + errMsgRet;
            }
            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return "";
        }
        public string CGInStorageAudit(ADODB.Connection oCon, string id, string utfs1, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {

            string strResult = string.Empty;
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_997_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                return "登录失败，原因：" + u8Login.ShareString;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/ProductIn/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/PuStoreIn/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：10
            broker.AssignNormalValue("sVouchType", "01");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", id);


            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            broker.AssignNormalValue("cnnFrom", oCon);

            //给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", utfs1);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            //给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            //给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            //给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());

            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String errMsgRet = broker.GetResult("errMsg") as System.String;
            if (result == false)
            {
                //结束本次调用，释放API资源
                broker.Release();
                return "错误" + errMsgRet;
            }
            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return "";
        }
       
        #endregion
        public string CPOutStorageAudit(ADODB.Connection oCon, DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {
            if (ds.Tables[0].DefaultView.Count == 0)
            {
                return "成品入库单据不能为空";
            }

            string strResult = string.Empty;
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_997_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                return "登录失败，原因：" + u8Login.ShareString;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/ProductIn/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/saleout/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：10
            broker.AssignNormalValue("sVouchType", "32");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", ds.Tables[0].DefaultView[0]["ID"].ToString());


            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            broker.AssignNormalValue("cnnFrom", oCon);

            //给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", ds.Tables[0].DefaultView[0]["ufts1"]);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            //给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            //给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            //给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());

            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String errMsgRet = broker.GetResult("errMsg") as System.String;
            if (result == false)
            {
                //结束本次调用，释放API资源
                broker.Release();
                return "审核失败：" + errMsgRet;
            }
            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return "";
        }
        #region 其他出库的审核API
        public string OtherCKAudit(DataSet ds, DataSet dsCKAndPC, string strYongYouDBName, string strAccID, string strYear, string strUserID, string strPassword, string strDate, string strServer)
        {
            if (dsCKAndPC.Tables["RdRecord09"].DefaultView.Count == 0)
            {
                return "其他出库单据不能为空11";
            }

            #region 创建一个根据批次，存货编码，货位，汇总数量的表
            DataTable dtRealQty = new DataTable();
            dtRealQty.Columns.Add(new DataColumn("SerialID", typeof(int)));
            dtRealQty.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("cPosCode", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("SHBacthNo", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("Quantity", typeof(decimal)));
            #endregion
            #region 汇总扫描明细表
            int iSerialID = 1;
            for (int i = 0; i < ds.Tables["T_QTCKProduct"].DefaultView.Count; i++)
            {
                string strcInvCode = ds.Tables["T_QTCKProduct"].DefaultView[i]["ProductCode"].ToString();
                string strSHBacthNo = ds.Tables["T_QTCKProduct"].DefaultView[i]["BatchNo"].ToString();
                string strcPosition = ds.Tables["T_QTCKProduct"].DefaultView[i]["goodAddress"].ToString();

                string strcPosiCode = GetwhOrPoCodeAndName(strcPosition, 0);

                //数量
                decimal decBarCount = 0;
                //
                if (ds.Tables["T_QTCKProduct"].DefaultView[i]["Quantity"] != DBNull.Value)
                {
                    decBarCount = Convert.ToDecimal(ds.Tables["T_QTCKProduct"].DefaultView[i]["Quantity"].ToString());
                }
                //

                dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and cPosCode='" + strcPosiCode + "' and SHBacthNo='" + strSHBacthNo + "'  ";
                if (dtRealQty.DefaultView.Count > 0)
                {
                    decimal decBaseQty = Convert.ToDecimal(dtRealQty.DefaultView[0]["Quantity"].ToString());
                    //
                    dtRealQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                    dtRealQty.DefaultView[0].EndEdit();
                }
                else
                {
                    DataRow drNew = dtRealQty.NewRow();
                    drNew["SerialID"] = iSerialID;
                    drNew["cInvCode"] = strcInvCode;
                    drNew["cPosCode"] = strcPosiCode;
                    drNew["SHBacthNo"] = strSHBacthNo;
                    drNew["Quantity"] = decBarCount;
                    dtRealQty.Rows.Add(drNew);
                    iSerialID++;
                }
                //
            }
            dtRealQty.DefaultView.RowFilter = "";
            #endregion
            #region 判断是否扫的存货批次货位不是其他出库单的
            foreach (DataRowView drv in dtRealQty.DefaultView)
            {
                string strcBatch = drv["SHBacthNo"].ToString();
                string strcInvCode = drv["cInvCode"].ToString();
                string strcPosition = drv["cPosCode"].ToString();
                //
                DataRow[] drU8Select = dsCKAndPC.Tables["RdRecords09"].Select("cInvCode='" + strcInvCode + "' and isnull(cPosition,'')='" + strcPosition + "' and isnull( cBatch,'')='" + strcBatch + "'  ");
                //
                if (drU8Select.Length == 0)
                {
                    return "存货" + strcInvCode + "批次" + strcBatch + "货位" + strcPosition + "的不是当前出库单需要出库的，不能审核";
                }
            }
            #endregion
            #region 创建一个根据批次，存货编码，货位，汇总数量的表
            DataTable dtU8OutQty = new DataTable();
            dtU8OutQty.Columns.Add(new DataColumn("SerialID", typeof(int)));
            dtU8OutQty.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dtU8OutQty.Columns.Add(new DataColumn("cPosCode", typeof(string)));
            dtU8OutQty.Columns.Add(new DataColumn("SHBacthNo", typeof(string)));
            dtU8OutQty.Columns.Add(new DataColumn("Quantity", typeof(decimal)));
            #endregion
            #region 汇总其他出库表
            int iSerialIDU8 = 1;
            for (int i = 0; i < dsCKAndPC.Tables["RdRecords09"].DefaultView.Count; i++)
            {
                string strcInvCode = dsCKAndPC.Tables["RdRecords09"].DefaultView[i]["cInvCode"].ToString();
                string strSHBacthNo = dsCKAndPC.Tables["RdRecords09"].DefaultView[i]["cBatch"].ToString();
                string strcPosition = dsCKAndPC.Tables["RdRecords09"].DefaultView[i]["cPosition"].ToString();

                //数量
                decimal decBarCount = 0;
                //
                if (dsCKAndPC.Tables["RdRecords09"].DefaultView[i]["iQuantity"] != DBNull.Value)
                {
                    decBarCount = Convert.ToDecimal(dsCKAndPC.Tables["RdRecords09"].DefaultView[i]["iQuantity"].ToString());
                }
                //

                dtU8OutQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and isnull(cPosCode,'') ='" + strcPosition + "' and  isnull(SHBacthNo,'')='" + strSHBacthNo + "'  ";
                if (dtU8OutQty.DefaultView.Count > 0)
                {
                    decimal decBaseQty = Convert.ToDecimal(dtU8OutQty.DefaultView[0]["Quantity"].ToString());
                    //
                    dtU8OutQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                    dtU8OutQty.DefaultView[0].EndEdit();
                }
                else
                {
                    DataRow drNew = dtU8OutQty.NewRow();
                    drNew["SerialID"] = iSerialID;
                    drNew["cInvCode"] = strcInvCode;
                    drNew["cPosCode"] = strcPosition;
                    drNew["SHBacthNo"] = strSHBacthNo;
                    drNew["Quantity"] = decBarCount;
                    dtU8OutQty.Rows.Add(drNew);
                    iSerialIDU8++;
                }
                //
            }
            dtU8OutQty.DefaultView.RowFilter = "";
            #endregion
            #region 判断对应的批次货位数量是否超出，是否少扫描了
            dtU8OutQty.DefaultView.RowFilter = "";
            foreach (DataRowView drv in dtU8OutQty.DefaultView)
            {
                string strcBatch = drv["SHBacthNo"].ToString();
                string strcInvCode = drv["cInvCode"].ToString();
                string strcPosition = drv["cPosCode"].ToString();
                //
                decimal decU8OutQty = drv["Quantity"] == DBNull.Value ? 0 : (decimal)drv["Quantity"];

                dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and  isnull(cPosCode,'') ='" + strcPosition + "' and isnull( SHBacthNo,'') ='" + strcBatch + "'  ";
                //
                if (dtRealQty.DefaultView.Count == 0)
                {
                    return "存货" + strcInvCode + "批次" + strcBatch + "货位" + strcPosition + "的还没有扫描，不能审批出库单";
                }
                else
                {
                    //扫描数量
                    decimal decScanQty = 0;
                    foreach (DataRowView drvScan in dtRealQty.DefaultView)
                    {
                        decimal decItem = drvScan["Quantity"] == DBNull.Value ? 0 : (decimal)drvScan["Quantity"];
                        decScanQty = decScanQty + decItem;
                    }
                    //
                    if (decU8OutQty != decScanQty)
                    {
                        return "存货" + strcInvCode + "批次" + strcBatch + "货位" + strcPosition + "的需要出库数量" + decU8OutQty.ToString("###,###,##0.00###") + "，当前扫描数量" + decScanQty.ToString("###,###,##0.00###") + ",请检查";
                    }
                }
            }
            #endregion

            #region 判断每个存货的数量必须相等
            List<string> strPDAProductCodeList = new List<string>();
            List<decimal> decPDAQuantityList = new List<decimal>();
            foreach (DataRowView drv in ds.Tables["T_QTCKProduct"].DefaultView)
            {
                string strProductCodeTemp = drv["ProductCode"].ToString().Trim().ToLower();
                string strcBatch = drv["BatchNo"].ToString().Trim().ToLower();
                string strgoodAddress = drv["goodAddress"].ToString().Trim().ToLower();
                //
                string strcPositon = GetwhOrPoCodeAndName(strgoodAddress, 0);
                decimal decQuantityTemp = drv["Quantity"] == DBNull.Value ? 0 : Convert.ToDecimal(drv["Quantity"].ToString());



                bool bISExists = false;
                for (int i = 0; i < strPDAProductCodeList.Count; i++)
                {
                    if (strPDAProductCodeList[i].ToLower() == strProductCodeTemp.ToLower())
                    {
                        bISExists = true;
                        decPDAQuantityList[i] = decPDAQuantityList[i] + decQuantityTemp;
                    }
                }
                if (!bISExists)
                {
                    strPDAProductCodeList.Add(strProductCodeTemp);
                    decPDAQuantityList.Add(decQuantityTemp);
                }
            }
            //
            List<string> strU8ProductCodeList = new List<string>();
            List<decimal> decU8QuantityList = new List<decimal>();
            foreach (DataRowView drv in dsCKAndPC.Tables["RdRecords09"].DefaultView)
            {
                string strProductCodeTemp = drv["cInvcode"].ToString().Trim().ToLower();
                decimal decQuantityTemp = drv["iQuantity"] == DBNull.Value ? 0 : Convert.ToDecimal(drv["iQuantity"].ToString());
                bool bISExists = false;
                for (int i = 0; i < strU8ProductCodeList.Count; i++)
                {
                    if (strU8ProductCodeList[i].ToLower() == strProductCodeTemp.ToLower())
                    {
                        bISExists = true;
                        decU8QuantityList[i] = decU8QuantityList[i] + decQuantityTemp;
                    }
                }
                if (!bISExists)
                {
                    strU8ProductCodeList.Add(strProductCodeTemp);
                    decU8QuantityList.Add(decQuantityTemp);
                }
            }
            //比较
            for (int i = 0; i < strU8ProductCodeList.Count; i++)
            {
                string strProductCodeTemp = strU8ProductCodeList[i];
                decimal decQuantityTemp = decU8QuantityList[i];
                int iPos = strPDAProductCodeList.IndexOf(strProductCodeTemp);
                if (iPos < 0)
                {
                    return "存货：" + strProductCodeTemp + "没有扫描";
                }
            }
            //比较
            for (int i = 0; i < strPDAProductCodeList.Count; i++)
            {
                string strProductCodeTemp = strPDAProductCodeList[i];
                decimal decQuantityTemp = decPDAQuantityList[i];
                int iPos = strU8ProductCodeList.IndexOf(strProductCodeTemp);
                if (iPos < 0)
                {
                    return "扫描的存货：" + strProductCodeTemp + "在其他出库不存在";
                }
                if (decQuantityTemp > decU8QuantityList[iPos])
                {
                    return "存货：" + strProductCodeTemp + "大于出库数量！";
                }
                if (decQuantityTemp < decU8QuantityList[iPos])
                {
                    return "存货：" + strProductCodeTemp + "小于出库货单数量！";
                }
            }
            #endregion
            DateTime dtCreateDate = Convert.ToDateTime(strDate);
            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            string sAccID = strAccID;
            string sYear = strYear;
            string sUserID = strUserID;
            string sPassword = strPassword;
            string sDate = strDate;
            string sServer = strServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/otherout/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/otherout/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：08
            broker.AssignNormalValue("sVouchType", "09");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", dsCKAndPC.Tables["RdRecord09"].DefaultView[0]["ID"].ToString());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", dsCKAndPC.Tables["RdRecord09"].DefaultView[0]["ufts1"]);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            //给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            //给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            //给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                string strErrMsg = "";
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strErrMsg = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strErrMsg = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strErrMsg = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strErrMsg;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                //获取out/inout参数值

                //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return "失败！" + errMsgRet;
            }
            //获取out/inout参数值


            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return "";

        }
        #endregion

        #region 中天销售出库单API
        public string CPOutStorageAudit(ADODB.Connection oCon, string strID, string strutfs1, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {
            string strResult = string.Empty;
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_997_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                return "登录失败，原因：" + u8Login.ShareString;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/ProductIn/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/saleout/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：10
            broker.AssignNormalValue("sVouchType", "32");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", strID);


            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            broker.AssignNormalValue("cnnFrom", oCon);

            //给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", strutfs1);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            //给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            //给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            //给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());

            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String errMsgRet = broker.GetResult("errMsg") as System.String;
            if (result == false)
            {
                //结束本次调用，释放API资源
                broker.Release();
                return "审核失败：" + errMsgRet;
            }
            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return "";
        }
        public string CPOutStorage(ADODB.Connection oCon, DataSet ds, DataSet dsToU8, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strPKValue)
        {
            if (ds.Tables[0].DefaultView.Count == 0)
            {
                return "成品出库单据不能为空";
            }
            DataSet dsUser = new DataSet();
            try
            {
                dsUser = CustomizableDesignBLL.GetData("select * from UFSystem..UA_User where cUser_Id='" + sUserID + "'");
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            //
            string strResult = string.Empty;
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_997_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                return "登录失败，原因：" + u8Login.ShareString;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/saleout/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/saleout/Add");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：32
            broker.AssignNormalValue("sVouchType", "32");
            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);
            //给BO表头参数DomHead赋值，此BO参数的业务类型为销售出库单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            DomHead[0]["ccode"] = "XSCK" + DateTime.Now.ToString("yyyyMMdd") + "0001"; //出库单号，string类型
            DomHead[0]["ddate"] = sDate; //出库日期，DateTime类型
            //DomHead[0]["cwhname"] = strcwhname; //"PC原材料仓"; //仓库，string类型
            DomHead[0]["cbustype"] = dsToU8.Tables[0].DefaultView[0]["cbustype"].ToString(); //"普通销售"; //业务类型，int类型
            DomHead[0]["iverifystate"] = "0"; //iverifystate，int类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，int类型
            // DomHead[0]["ccusabbname"] = dsToU8.Tables["Sales_FHD_T"].DefaultView[0]["ccusabbname"].ToString(); //客户，string类型
            // DomHead[0]["cmaker"] = ds.Tables[0].DefaultView[0]["cMaker"].ToString(); //制单人，string类型
            DomHead[0]["cmaker"] = dsUser.Tables[0].DefaultView[0]["cUser_Name"].ToString();
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            DomHead[0]["cvouchtype"] = "32"; //单据类型，string类型
            DomHead[0]["cwhcode"] = ds.Tables[0].DefaultView[0]["cWhCode"].ToString();//"30"; //仓库编码，string类型
            DomHead[0]["csource"] = "发货单"; //单据来源，int类型
            DomHead[0]["brdflag"] = "0"; //收发标志，int类型
            DomHead[0]["crdcode"] = "201";
            DomHead[0]["ccuscode"] = dsToU8.Tables[0].DefaultView[0]["ccuscode"].ToString(); //"00000001"; //客户编码，string类型
            DomHead[0]["bisstqc"] = "0"; //库存期初标识，string类型
            // DomHead[0]["ccusname"] = dsToU8.Tables["Sales_FHD_T"].DefaultView[0]["ccusname"].ToString(); // "世纪天华集团公司"; //客户名称，string类型
            //DomHead[0]["csourcels"] = ""; //单据来源，string类型
            //DomHead[0]["ccusdefine1"] = ""; //客户自定义项1，string类型
            //DomHead[0]["ccusdefine2"] = ""; //客户自定义项2，string类型
            //DomHead[0]["ccusdefine3"] = ""; //客户自定义项3，string类型
            //DomHead[0]["ccusdefine4"] = ""; //客户自定义项4，string类型
            //DomHead[0]["ccusdefine5"] = ""; //客户自定义项5，string类型
            //DomHead[0]["ccusdefine6"] = ""; //客户自定义项6，string类型
            //DomHead[0]["ccusdefine7"] = ""; //客户自定义项7，string类型
            //DomHead[0]["ccusdefine8"] = ""; //客户自定义项8，string类型
            //DomHead[0]["ccusdefine9"] = ""; //客户自定义项9，string类型
            //DomHead[0]["ccusdefine12"] = ""; //客户自定义项12，string类型
            //DomHead[0]["ccusdefine13"] = ""; //客户自定义项13，string类型
            //DomHead[0]["ccusdefine14"] = ""; //客户自定义项14，string类型
            //DomHead[0]["ccusdefine15"] = ""; //客户自定义项15，string类型
            //DomHead[0]["ccusdefine16"] = ""; //客户自定义项16，string类型
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型
            //DomHead[0]["ccusdefine10"] = ""; //客户自定义项10，string类型
            //DomHead[0]["ccusdefine11"] = ""; //客户自定义项11，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型
            //DomHead[0]["iflowid"] = ""; //流程模式ID，string类型
            //DomHead[0]["cflowname"] = ""; //流程模式描述，string类型
            //DomHead[0]["cinvoicecompany"] = "000"; //开票单位编码，string类型
            //DomHead[0]["cinvoicecompanyabbname"] = "000"; //开票单位简称，string类型
            //DomHead[0]["febweight"] = ""; //重量，string类型
            //DomHead[0]["cebweightunit"] = ""; //重量单位，string类型
            //DomHead[0]["cebexpresscode"] = ""; //快递单号，string类型
            //DomHead[0]["bscanexpress"] = ""; //是否确认快递单号，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            //DomHead[0]["crdname"] = ""; //出库类别，string类型
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            DomHead[0]["cbuscode"] = dsToU8.Tables[0].DefaultView[0]["cDLCode"].ToString(); //"0000000105"; //业务号，string类型
            //DomHead[0]["cdepname"] = ""; //销售部门，string类型
            //DomHead[0]["cpersonname"] = ""; //业务员，string类型
            //DomHead[0]["dveridate"] = ""; //审核日期，DateTime类型
            DomHead[0]["cmemo"] = "PDA生成";  //备注，string类型
            //DomHead[0]["chandler"] = ""; //审核人，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["ccusperson"] = ""; //客户联系人，string类型
            //DomHead[0]["ccusphone"] = ""; //客户电话，string类型
            //DomHead[0]["ccushand"] = ""; //客户手机，string类型
            //DomHead[0]["ccusaddress"] = ""; //客户地址，string类型
            //DomHead[0]["contactphone"] = ""; //客户联系人电话，string类型
            //DomHead[0]["contactmobile"] = ""; //客户联系人手机，string类型
            //DomHead[0]["cdeliverunit"] = ""; //收货单位，string类型
            //DomHead[0]["ccontactname"] = ""; //收货单位联系人，string类型
            //DomHead[0]["cofficephone"] = ""; //收货单位联系人电话，string类型
            //DomHead[0]["cmobilephone"] = ""; //收货单位联系人手机，string类型
            //DomHead[0]["cpsnophone"] = ""; //业务员电话，string类型
            //DomHead[0]["cpsnmobilephone"] = ""; //业务员手机，string类型
            //DomHead[0]["cstname"] = ""; //销售类型，string类型
            //string ccuscode = dsToU8.Tables[0].DefaultView[0]["ccuscode"].ToString();
            //string depSql = "select cCusDepart from " + strYongYouDBName + ".dbo.Customer where ccuscode='" + ccuscode + "'";
            //DataSet depDs = CustomizableDesignBLL.GetData(depSql);
            //if (depDs.Tables[0].DefaultView.Count == 0) {
            //    return "失败！客户未找到对应部门";
            //}
            string cdepcode = dsToU8.Tables[0].DefaultView[0]["cdepcode"].ToString();
            DomHead[0]["cdepcode"] = cdepcode;//depDs.Tables[0].DefaultView[0]["cCusDepart"].ToString(); //"01"; //部门编码，string类型
            //
            // DomHead[0]["crdcode"] = "";//"22"; //出库类别编码，string类型
            DomHead[0]["cstcode"] = dsToU8.Tables[0].DefaultView[0]["cstcode"].ToString(); // "01"; //销售类型编码，string类型
            //DomHead[0]["cvouchname"] = ""; //单据类名，int类型
            DomHead[0]["cdlcode"] = dsToU8.Tables[0].DefaultView[0]["DLID"].ToString(); //"1000000176"; //发货单id，string类型
            //DomHead[0]["cvenabbname"] = ""; //供应商，string类型
            DomHead[0]["cpersoncode"] = dsToU8.Tables[0].DefaultView[0]["cpersoncode"].ToString();// "030401"; //业务员编码，string类型
            //DomHead[0]["cbillcode"] = ""; //发票id，string类型
            //DomHead[0]["cvencode"] = ""; //供应商代码，string类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["gspcheck"] = ""; //gsp复核标志，string类型
            //DomHead[0]["isalebillid"] = ""; //发票号，string类型
            //DomHead[0]["iarriveid"] = "0000000105"; //发货单号，string类型
            //DomHead[0]["dchkdate"] = ""; //检验日期，DateTime类型
            //DomHead[0]["cchkperson"] = ""; //检验员，string类型
            DomHead[0]["vt_id"] = "87"; //模版号，int类型
            //DomHead[0]["cshipaddress"] = ""; //发货地址，string类型
            //DomHead[0]["caddcode"] = ""; //发货地址编码，string类型
            //DomHead[0]["cchkcode"] = ""; //检验单号，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            DomHead[0]["cdefine10"] = strPKValue; //表头自定义项10，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cinspector"] = ""; //验货人，string类型
            //DomHead[0]["dinspecttime"] = ""; //验货时间，string类型
            //DomHead[0]["cweighter"] = ""; //称重人，string类型
            //DomHead[0]["dweighttime"] = ""; //称重时间，string类型

            //给BO表体参数domBody赋值，此BO参数的业务类型为销售出库单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = dsToU8.Tables[1].DefaultView.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            int ij = 0;
            ds.Tables[1].Columns.Add("ddty", typeof(string));
            for (int i = 0; i < ds.Tables[1].DefaultView.Count; i++)
            {
                ds.Tables[1].DefaultView[i]["ddty"] = "0";
            }
            for (int iRow = 0; iRow < dsToU8.Tables[1].DefaultView.Count; iRow++)
            {

                decimal taskqty = decimal.Parse(dsToU8.Tables[1].DefaultView[iRow]["iQuantity"].ToString()) - decimal.Parse(dsToU8.Tables[1].DefaultView[iRow]["fOutQuantity"].ToString());
                string strInvCode = dsToU8.Tables[1].DefaultView[iRow]["cinvcode"].ToString();
                string strbatch = dsToU8.Tables[1].DefaultView[iRow]["cDefine33"].ToString();

                int c = 0;
                for (int i = 0; i < ds.Tables[1].DefaultView.Count; i++)
                {
                    if (strInvCode == ds.Tables[1].DefaultView[i]["cInvCode"].ToString() && ds.Tables[1].DefaultView[i]["ddty"].ToString() == "0" && taskqty > 0 && strbatch == ds.Tables[1].DefaultView[i]["cBatch"].ToString())
                    {
                        c++;
                        ds.Tables[1].DefaultView[i]["ddty"] = "1";
                        ds.Tables[1].DefaultView[i].EndEdit();
                        if (c == taskqty)
                        {
                            break;
                        }
                    }

                }
                if (c == 0 || taskqty == 0) continue;
                domBody[ij]["autoid"] = "0"; //主关键字段，int类型
                //domBody[iRow]["cinvm_unit"] = drSelectRowsInventory[0]["cComUnitCode"].ToString(); //"0108"; //inventory.cComUnitCode 主计量单位，string类型
                domBody[ij]["iquantity"] = c;//"1"; //数量，double类型
                domBody[ij]["cinvcode"] = strInvCode;// "01019002065"; //存货编码，string类型
                domBody[ij]["id"] = "0"; //ID，int类型
                domBody[ij]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                domBody[ij]["cbmemo"] = ""; //备注，string类型
                domBody[ij]["irowno"] = (iRow + 1).ToString(); //行号，string类型
                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["coutvouchid"] = ""; //对应蓝字出库单id，string类型
                //domBody[iRow]["coutvouchtype"] = ""; //对应蓝字出库单类型，string类型
                //domBody[iRow]["isredoutquantity"] = ""; //对应蓝字出库单退回数量，string类型
                //domBody[iRow]["isredoutnum"] = ""; //对应蓝字出库单退回件数，string类型
                //domBody[iRow]["ipesotype"] = "0"; //需求跟踪方式，string类型
                if (dsToU8.Tables[1].DefaultView[iRow]["cdemandcode"] != DBNull.Value)
                {
                    //domBody[ij]["ipesodid"] = dsToU8.Tables[1].DefaultView[iRow]["isosid"].ToString();// "1000000001"; //销售订单子表，string类型
                    //domBody[ij]["ipesotype"] = "0";
                    //domBody[ij]["ipesoseq"] = dsToU8.Tables[1].DefaultView[iRow]["iorderrowno"].ToString(); // "1000000001"; //销售订单子表，string类型
                    //domBody[ij]["cpesocode"] = dsToU8.Tables[1].DefaultView[iRow]["cSoCode"].ToString(); // "0000000001"; //销售订单号，string类型

                    domBody[ij]["isodid"] = dsToU8.Tables[1].DefaultView[iRow]["cdemandcode"].ToString();// "1000000001"; //销售订单子表，string类型
                    domBody[ij]["isotype"] = dsToU8.Tables[1].DefaultView[iRow]["idemandtype"].ToString();
                    //domBody[ij]["isoseq"] = dsToU8.Tables[1].DefaultView[iRow]["iorderrowno"].ToString(); // "1000000001"; //销售订单子表，string类型
                    domBody[ij]["csocode"] = dsToU8.Tables[1].DefaultView[iRow]["cdemandcode"].ToString(); // "0000000001"; //销售订单号，string类型

                }
                
                //domBody[iRow]["ipesotype"] = "0"; //需求跟踪方式，string类型
                //  domBody[iRow]["ipesodid"] = "1000017304"; //销售订单子表，string类型 这个对比不到 暂时不填
                //domBody[iRow]["cpesocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["ipesoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["cpesocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["ipesoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["idebitids"] = ""; //借入借出单子表id，string类型
                //domBody[iRow]["fsettleqty"] = ""; //累计开票数量，string类型
                //domBody[iRow]["fretqtywkp"] = ""; //未开票退货数量，string类型
                //domBody[iRow]["fretqtyykp"] = ""; //已开票退货数量，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型

                /***************************** 以下是非必输字段 ****************************/
                //domBody[iRow]["cinvaddcode"] = ""; //存货代码，string类型
                //domBody[iRow]["cinvname"] = ""; //存货名称，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["isodid"] = ""; //销售订单子表ID，string类型
                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                //domBody[iRow]["bgsp"] = ""; //是否质检，int类型
                //domBody[iRow]["cgspstate"] = ""; //检验状态，double类型
                //domBody[iRow]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iRow]["cposname"] = ""; //货位，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["scrapufts"] = ""; //不合格品时间戳，string类型
                //domBody[iRow]["cinva_unit"] = ""; //库存单位，string类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["cvmivencode"] = ""; //代管商代码，string类型
                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型
                domBody[ij]["bvmiused"] = "0"; //代管消耗标识，int类型
                //domBody[iRow]["ivmisettlequantity"] = ""; //代管挂账确认单数量，double类型
                //domBody[iRow]["ivmisettlenum"] = ""; //代管挂账确认单件数，double类型
                //if (iinvexchrate != 0)
                //    domBody[iRow]["iinvexchrate"] = iinvexchrate.ToString(); //换算率，double类型
                //domBody[iRow]["cvouchcode"] = ""; //对应入库单id，string类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["isoutquantity"] = ""; //累计出库数量，double类型
                //domBody[iRow]["isoutnum"] = ""; //累计出库件数，double类型
                //domBody[iRow]["inquantity"] = decQuantity.ToString();// "2"; //应发数量，double类型
                //domBody[iRow]["ipprice"] = ""; //计划金额/售价金额，double类型
                domBody[ij]["cbdlcode"] = dsToU8.Tables[0].DefaultView[0]["cDLCode"].ToString();//"0000000121"; //发货单号，string类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型
                //domBody[ij]["iordertype"] = "0"; //销售订单类别，int类型
                //if (dsToU8.Tables[1].DefaultView[iRow]["isosid"] != DBNull.Value)
                //    domBody[ij]["iorderdid"] = dsToU8.Tables[1].DefaultView[iRow]["isosid"].ToString(); //"1000000001"; //iorderdid，int类型
                //if (dsToU8.Tables[1].DefaultView[iRow]["cSoCode"].ToString().Trim() != string.Empty)
                //    domBody[ij]["iordercode"] = dsToU8.Tables[1].DefaultView[iRow]["cSoCode"].ToString(); // "0000000001"; //销售订单号，string类型
                //if (dsToU8.Tables[1].DefaultView[iRow]["iorderrowno"] != DBNull.Value)
                //    domBody[ij]["iorderseq"] = dsToU8.Tables[1].DefaultView[iRow]["iorderrowno"].ToString(); // "1"; //销售订单行号，string类型

                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["ibondedsumqty"] = ""; //累计保税处理抽取数量，string类型
                //domBody[iRow]["strcontractid"] = ""; //合同号，string类型
                //domBody[iRow]["strcode"] = ""; //合同标的编码，string类型
                //domBody[iRow]["ccusinvcode"] = ""; //客户存货编码，string类型
                //domBody[iRow]["ccusinvname"] = ""; //客户存货名称，string类型
                //domBody[iRow]["cbaccounter"] = ""; //记账人，string类型
                domBody[ij]["bcosting"] = "1"; //是否核算，string类型
                //domBody[iRow]["isotype"] = ""; //需求跟踪方式，int类型
                //domBody[iRow]["stockupid"] = ""; //stockupid，string类型
                //domBody[iRow]["iavaquantity"] = ""; //可用量，double类型
                //domBody[iRow]["iavanum"] = ""; //可用件数，double类型
                //domBody[iRow]["ipresent"] = ""; //现存量，double类型
                //domBody[iRow]["ipresentnum"] = ""; //现存件数，double类型
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["cinvstd"] = ""; //规格型号，string类型

                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型
                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //表体自定义项6，double类型
                domBody[ij]["cdefine27"] = strPKValue;
                //domBody[iRow]["inum"] = ""; //件数，double类型
                //domBody[iRow]["citemcode"] = ""; //项目编码，string类型
                //domBody[iRow]["innum"] = ""; //应发件数，double类型
                //domBody[iRow]["cname"] = ""; //项目，string类型
                //domBody[iRow]["itrids"] = ""; //特殊单据子表标识，double类型
                //domBody[iRow]["citem_class"] = ""; //项目大类编码，string类型
                domBody[ij]["idlsid"] = dsToU8.Tables[1].DefaultView[iRow]["idlsid"].ToString();// "1000000277"; //DispatchLists. idlsid发货单子表ID，int类型
                //domBody[iRow]["isbsid"] = ""; //发票子表ID，int类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["isendquantity"] = ""; //发货数量，int类型
                //domBody[iRow]["isendnum"] = ""; //发货件数，int类型
                //domBody[iRow]["citemcname"] = ""; //项目大类名称，string类型
                //domBody[iRow]["iensid"] = ""; //委托子表id，double类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //属性1，double类型
                //domBody[iRow]["cbatchproperty3"] = ""; //属性3，double类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cbatchproperty4"] = ""; //属性4，double类型
                //domBody[iRow]["cbatchproperty5"] = ""; //属性5，double类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cbatchproperty6"] = ""; //属性6，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //属性7，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cbatchproperty8"] = ""; //属性8，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //属性9，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //属性10，DateTime类型
                //domBody[iRow]["cdefine34"] = ""; //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["impoids"] = ""; //生产订单子表ID，int类型
                //domBody[iRow]["icheckids"] = ""; //检验单子表ID，int类型
                //domBody[iRow]["cbatchproperty2"] = ""; //属性2，double类型
                //domBody[iRow]["cfree2"] = ""; //存货自由项2，string类型
                //domBody[iRow]["iunitcost"] = ""; //单价，double类型
                //domBody[iRow]["iprice"] = ""; //金额，double类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型
                //domBody[iRow]["ipunitcost"] = ""; //计划单价/售价，double类型
                //domBody[iRow]["igrossweight"] = ""; //毛重，string类型
                //domBody[iRow]["inetweight"] = ""; //净重，string类型
                domBody[ij]["cbatch"] = strbatch;//dsToU8.Tables[1].DefaultView[iRow]["cBatch"].ToString(); //批号，string类型
                ij++;
                //domBody[iRow]["iinvsncount"] = ""; //库存序列号，int类型
                //domBody[iRow]["iposflag"] = ""; //是否已分配货位，string类型
            }
            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            broker.AssignNormalValue("cnnFrom", oCon);

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExceptionMsg = "";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExceptionMsg = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExceptionMsg = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExceptionMsg = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExceptionMsg;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return "失败！" + errMsgRet;
            }
            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return "";
        }
        #endregion
        #region PDA货位调整生成U8货位调整单 使用sql语句插入的方式，不是调用U8API的
        public string YYHuoWeiTiaoZheng(DataSet ds, string strYongYouDBName, string strZT, string sYear, string strUserCode, string strUserPwd, string sDate, string sServer, string strPKValue)
        {
            string strRet = "";

            #region 判断是否已经生成过了货位调整单
            try
            {
                if (CustomizableDesignBLL.IsExist(" SELECT COUNT(*)  FROM " + strYongYouDBName + ".dbo.AdjustPVouch WHERE cDefine10='" + strPKValue + "'"))
                {
                    return "pda货位调整单号" + strPKValue + "已经生成对应判U8货位调整单据，不能重复生成";
                }
            }
            catch (Exception ex)
            {
                return "判断货位调整单是否存在出错：" + ex.Message;
            }
            #endregion
            //思路: 需要修改的表有InvPositionSum 存货货位存量表  AdjustPVouch 调整单主表  AdjustPVouchs 调整单子表  InvPosition 存货货位记录表
            //其中 InvPositionSum 存货货位存量表 需要判断条件，分两种情况 
            //1. 调整前货位的 存货要根据仓库编码、存货编码、批号、生产日期、失效日期去判断对应的库存数量是否小于调整数量,不够的报错提示，够的直接减去库存数量  
            //2. 调整后货位的 存货要根据仓库编码、存货编码、批号、生产日期、失效日期去获取对应的记录，如果有记录的，数量增加，如果没有的增加记录
            //然后 后面的两个调整单表，根据PDA中间表记录进行増行  最后存货货位记录表根据调整单子表记录重新增加行数据。
            //最后回刷 UA_Identity和 VoucherHistory这个两个表中的最大流水号
            #region 首先把PDA的中间条码扫描细表根据  仓库编码、存货编码、批号、前后货位分别分组 汇总数量
            #region 获取条码数据
            string strBarCodeWhere = "";
            for (int i = 0; i < ds.Tables["T_AdjustPVouchProduct"].DefaultView.Count; i++)
            {
                string strBarCode = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["BarCode"].ToString();

                if (strBarCodeWhere == "")
                {
                    strBarCodeWhere = "'" + strBarCode + "'";
                }
                else
                {
                    strBarCodeWhere = strBarCodeWhere + ",'" + strBarCode + "'";
                }
            }
            DataSet dsBarCode = new DataSet();
            //
            string strBarSql = "SELECT *FROM dbo.T_BarCode WHERE BarCode IN (" + strBarCodeWhere + ")";
            //
            try
            {
                dsBarCode = CustomizableDesignBLL.GetData(strBarSql);
            }
            catch (Exception ex)
            {
                return "获取条码数据，出错：" + ex.Message;
            }
            if (dsBarCode == null || dsBarCode.Tables[0].DefaultView.Count == 0)
            {
                return "获取条码数据为空,无法生成";
            }
            #endregion
            //
            #region 创建一个根据批次，存货编码，有效期，货位，汇总数量的表
            DataTable dtRealQty = new DataTable();
            dtRealQty.Columns.Add(new DataColumn("SerialID", typeof(int)));
            dtRealQty.Columns.Add(new DataColumn("cInvCode", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("cPosCode", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("SHBacthNo", typeof(string)));
            dtRealQty.Columns.Add(new DataColumn("EndDate", typeof(DateTime)));
            dtRealQty.Columns.Add(new DataColumn("ValidDate", typeof(int)));
            dtRealQty.Columns.Add(new DataColumn("Quantity", typeof(decimal)));
            dtRealQty.Columns.Add(new DataColumn("strType", typeof(string)));
            #endregion
            #region 汇总扫描明细表
            int iSerialID = 1;
            for (int i = 0; i < ds.Tables["T_AdjustPVouchProduct"].DefaultView.Count; i++)
            {
                string strcInvCode = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["cInvCode"].ToString();
                string strSHBacthNo = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["cBatch"].ToString();
                string strBeforPosition = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["BeforPosition"].ToString();
                string strAfterPosition = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["AfterPosition"].ToString();
                string strBarCode = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["BarCode"].ToString();
                int iValidDate = -1;
                //失效日期
                DateTime dtEndDate = new DateTime(1999, 1, 1);
                bool bisNeedDate = false;
                DataRow[] drSelectBarCode = dsBarCode.Tables[0].Select("BarCode='" + strBarCode + "'");
                if (drSelectBarCode.Length > 0)
                {
                    bisNeedDate = drSelectBarCode[0]["EndDate"] == DBNull.Value ? false : true;
                    if (bisNeedDate)
                        dtEndDate = Convert.ToDateTime(drSelectBarCode[0]["EndDate"]);
                    //
                    if (drSelectBarCode[0]["ValidDate"] != DBNull.Value)
                        iValidDate = Convert.ToInt32(drSelectBarCode[0]["ValidDate"]);

                }
                //数量
                decimal decBarCount = 0;
                //
                if (ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["BarCount"] != DBNull.Value)
                {
                    decBarCount = Convert.ToDecimal(ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["BarCount"].ToString());
                }
                //
                #region 调整前货位
                if (bisNeedDate)
                {
                    dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and cPosCode='" + strBeforPosition + "' and SHBacthNo='" + strSHBacthNo + "' and EndDate='" + dtEndDate.ToString() + "' and strType='前货位'";
                    if (dtRealQty.DefaultView.Count > 0)
                    {
                        decimal decBaseQty = Convert.ToDecimal(dtRealQty.DefaultView[0]["Quantity"].ToString());
                        //
                        dtRealQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                        dtRealQty.DefaultView[0].EndEdit();
                    }
                    else
                    {
                        DataRow drNew = dtRealQty.NewRow();
                        drNew["SerialID"] = iSerialID;
                        drNew["cInvCode"] = strcInvCode;
                        drNew["cPosCode"] = strBeforPosition;
                        drNew["SHBacthNo"] = strSHBacthNo;
                        drNew["EndDate"] = dtEndDate;
                        drNew["ValidDate"] = iValidDate;
                        drNew["Quantity"] = decBarCount;
                        drNew["strType"] = "前货位";
                        dtRealQty.Rows.Add(drNew);
                        iSerialID++;
                    }
                }
                else
                {
                    dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and cPosCode='" + strBeforPosition + "' and SHBacthNo='" + strSHBacthNo + "' and EndDate is null and strType='前货位' ";
                    if (dtRealQty.DefaultView.Count > 0)
                    {
                        decimal decBaseQty = Convert.ToDecimal(dtRealQty.DefaultView[0]["Quantity"].ToString());
                        //
                        dtRealQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                        dtRealQty.DefaultView[0].EndEdit();
                    }
                    else
                    {
                        DataRow drNew = dtRealQty.NewRow();
                        drNew["SerialID"] = iSerialID;
                        drNew["cInvCode"] = strcInvCode;
                        drNew["cPosCode"] = strBeforPosition;
                        drNew["SHBacthNo"] = strSHBacthNo;
                        drNew["Quantity"] = decBarCount;
                        drNew["strType"] = "前货位";
                        dtRealQty.Rows.Add(drNew);
                        iSerialID++;
                    }
                }
                #endregion
                //
                #region 调整后货位
                if (bisNeedDate)
                {
                    dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and cPosCode='" + strAfterPosition + "' and SHBacthNo='" + strSHBacthNo + "' and EndDate='" + dtEndDate.ToString() + "' and strType='后货位'";
                    if (dtRealQty.DefaultView.Count > 0)
                    {
                        decimal decBaseQty = Convert.ToDecimal(dtRealQty.DefaultView[0]["Quantity"].ToString());
                        //
                        dtRealQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                        dtRealQty.DefaultView[0].EndEdit();
                    }
                    else
                    {
                        DataRow drNew = dtRealQty.NewRow();
                        drNew["SerialID"] = iSerialID;
                        drNew["cInvCode"] = strcInvCode;
                        drNew["cPosCode"] = strAfterPosition;
                        drNew["SHBacthNo"] = strSHBacthNo;
                        drNew["EndDate"] = dtEndDate;
                        drNew["ValidDate"] = iValidDate;
                        drNew["Quantity"] = decBarCount;
                        drNew["strType"] = "后货位";
                        dtRealQty.Rows.Add(drNew);
                        iSerialID++;
                    }
                }
                else
                {
                    dtRealQty.DefaultView.RowFilter = " cInvCode='" + strcInvCode + "' and cPosCode='" + strAfterPosition + "' and SHBacthNo='" + strSHBacthNo + "' and EndDate is null and strType='后货位' ";
                    if (dtRealQty.DefaultView.Count > 0)
                    {
                        decimal decBaseQty = Convert.ToDecimal(dtRealQty.DefaultView[0]["Quantity"].ToString());
                        //
                        dtRealQty.DefaultView[0]["Quantity"] = Math.Round(decBarCount + decBaseQty, 2);
                        dtRealQty.DefaultView[0].EndEdit();
                    }
                    else
                    {
                        DataRow drNew = dtRealQty.NewRow();
                        drNew["SerialID"] = iSerialID;
                        drNew["cInvCode"] = strcInvCode;
                        drNew["cPosCode"] = strAfterPosition;
                        drNew["SHBacthNo"] = strSHBacthNo;
                        drNew["Quantity"] = decBarCount;
                        drNew["strType"] = "后货位";
                        dtRealQty.Rows.Add(drNew);
                        iSerialID++;
                    }
                }
                #endregion

            }
            dtRealQty.DefaultView.RowFilter = "";
            #endregion
            #endregion
            DataSet dsAll = new DataSet();
            #region 根据汇总数量表，生成获取对应的存货货位存量表记录条件语句
            string strInVPostionSumwhere = string.Empty;
            foreach (DataRowView drv in dtRealQty.DefaultView)
            {
                string strcinvCode = drv["cInvCode"].ToString();
                string strcPosCode = GetwhOrPoCodeAndName(drv["cPosCode"].ToString(), 0);
                string strSHBacthNo = drv["SHBacthNo"].ToString();
                string strEndDate = drv["EndDate"].ToString();
                string strValidDate = drv["ValidDate"].ToString();
                string strcWhCode = GetwhOrPoCodeAndName(ds.Tables[0].DefaultView[0]["StorageName"].ToString(), 0);
                //
                string strcstrType = drv["strType"].ToString();
                if (strInVPostionSumwhere == string.Empty)
                {
                    if (strValidDate == "")
                        strInVPostionSumwhere = "(cWhCode='" + strcWhCode + "' AND cPosCode='" + strcPosCode + "' AND cInvCode='" + strcinvCode + "' AND ISNULL(cBatch,'')='" + strSHBacthNo + "'  AND iMassDate is null AND dVDate is null )";
                    else
                        strInVPostionSumwhere = "(cWhCode='" + strcWhCode + "' AND cPosCode='" + strcPosCode + "' AND cInvCode='" + strcinvCode + "' AND ISNULL(cBatch,'')='" + strSHBacthNo + "' AND iMassDate='" + strValidDate + "' AND dVDate='" + strEndDate + "' )";
                }
                else
                {
                    if (strValidDate == "")
                        strInVPostionSumwhere = strInVPostionSumwhere + " or (cWhCode='" + strcWhCode + "' AND cPosCode='" + strcPosCode + "' AND cInvCode='" + strcinvCode + "' AND ISNULL(cBatch,'')='" + strSHBacthNo + "'  AND iMassDate is null AND dVDate is null  )";
                    else
                        strInVPostionSumwhere = strInVPostionSumwhere + " or (cWhCode='" + strcWhCode + "' AND cPosCode='" + strcPosCode + "' AND cInvCode='" + strcinvCode + "' AND ISNULL(cBatch,'')='" + strSHBacthNo + "' AND iMassDate='" + strValidDate + "' AND dVDate='" + strEndDate + "' )";
                }
            }
            //
            #endregion
            List<DataTableName> dtnlist = new List<DataTableName>();
            DataTableName dtn = new DataTableName();
            dtn.strSelectSQL = " SELECT * FROM " + strYongYouDBName + ".dbo.InvPositionSum where " + strInVPostionSumwhere;
            dtn.strTableName = "InvPositionSum";
            dtnlist.Add(dtn);
            dtn = new DataTableName();
            dtn.strSelectSQL = " SELECT * FROM " + strYongYouDBName + ".dbo.AdjustPVouch where 1=2  ";
            dtn.strTableName = "AdjustPVouch";
            dtnlist.Add(dtn);
            dtn = new DataTableName();
            dtn.strSelectSQL = " SELECT * FROM " + strYongYouDBName + ".dbo.AdjustPVouchs where 1=2";
            dtn.strTableName = "AdjustPVouchs";
            dtnlist.Add(dtn);
            dtn = new DataTableName();
            dtn.strSelectSQL = " SELECT * FROM " + strYongYouDBName + ".dbo.InvPosition where 1=2";
            dtn.strTableName = "InvPosition";
            dtnlist.Add(dtn);
            try
            {
                dsAll = CustomizableDesignBLL.GetData(dtnlist, true);
            }
            catch (Exception ex)
            {
                return "获取存货货位表和调整单表结构出错：" + ex.Message;
            }
            //
            dsAll.Tables[0].PrimaryKey = new DataColumn[] { dsAll.Tables["InvPositionSum"].Columns["Autoid"] };
            //
            #region 判断调整前货位的库存数量是否足够
            foreach (DataRowView drv in dtRealQty.DefaultView)
            {
                string strcinvCode = drv["cInvCode"].ToString();
                string strcPosCode = GetwhOrPoCodeAndName(drv["cPosCode"].ToString(), 0);
                string strSHBacthNo = drv["SHBacthNo"].ToString();
                string strEndDate = drv["EndDate"].ToString();
                string strValidDate = drv["ValidDate"].ToString();
                string strcWhCode = GetwhOrPoCodeAndName(ds.Tables[0].DefaultView[0]["StorageName"].ToString(), 0);
                decimal decQtyCheck = drv["Quantity"] == DBNull.Value ? 0 : (decimal)drv["Quantity"];
                //
                string strcstrType = drv["strType"].ToString();
                if (strcstrType == "前货位")
                {
                    string strRowfilter = string.Empty;
                    if (strValidDate == "")
                        strRowfilter = " (cWhCode='" + strcWhCode + "' AND cPosCode='" + strcPosCode + "' AND cInvCode='" + strcinvCode + "' AND ISNULL(cBatch,'')='" + strSHBacthNo + "' AND iMassDate is null AND dVDate is null )";
                    else
                        strRowfilter = " (cWhCode='" + strcWhCode + "' AND cPosCode='" + strcPosCode + "' AND cInvCode='" + strcinvCode + "' AND ISNULL(cBatch,'')='" + strSHBacthNo + "' AND iMassDate='" + strValidDate + "' AND dVDate='" + strEndDate + "' )";
                    //
                    DataRow[] drSelctInvPositionSum = dsAll.Tables["InvPositionSum"].Select(strRowfilter, "Autoid");
                    //获取库存数据
                    decimal decKCQty = 0;
                    if (drSelctInvPositionSum.Length > 0)
                    {
                        foreach (DataRow drvItem in drSelctInvPositionSum)
                        {
                            decimal decQtyItem = drvItem["iQuantity"] == DBNull.Value ? 0 : (decimal)drvItem["iQuantity"];
                            //
                            decKCQty = decKCQty + decQtyItem;
                        }
                    }
                    //
                    if (decQtyCheck > decKCQty)
                    {
                        return "批次" + strSHBacthNo + "的存货" + strcinvCode + "在仓库" + strcWhCode + "货位" + strcPosCode + "中库存数量为" + decKCQty.ToString("###,###,###,##0.00###") + "，当前转移数量为" + decQtyCheck.ToString("###,###,###,##0.00###") + "，不能生成调整单，请检查修改！";
                    }
                }
            }
            #endregion
            #region 开始对存货货位存量表数据  根据调整前货位进行记录减少 和  调整后货位增加记录或者增加对应记录的数量
            DataRow[] drSelctdtRealQtyBeFore = dtRealQty.Select(" strType='前货位'", "SerialID");
            DataRow[] drSelctdtRealQtyAFter = dtRealQty.Select(" strType='后货位'", "SerialID");
            #region 调整前货位数据 数量进行减少
            foreach (DataRow drv in drSelctdtRealQtyBeFore)
            {
                string strcinvCode = drv["cInvCode"].ToString();
                string strcPosCode = GetwhOrPoCodeAndName(drv["cPosCode"].ToString(), 0);
                string strSHBacthNo = drv["SHBacthNo"].ToString();
                string strEndDate = drv["EndDate"].ToString();
                string strValidDate = drv["ValidDate"].ToString();
                string strcWhCode = GetwhOrPoCodeAndName(ds.Tables[0].DefaultView[0]["StorageName"].ToString(), 0);
                decimal decQtyCheck = drv["Quantity"] == DBNull.Value ? 0 : (decimal)drv["Quantity"];
                //筛选条件
                string strRowfilter = string.Empty;
                if (strValidDate == "")
                    strRowfilter = " (cWhCode='" + strcWhCode + "' AND cPosCode='" + strcPosCode + "' AND cInvCode='" + strcinvCode + "' AND cBatch='" + strSHBacthNo + "' AND iMassDate is null AND dVDate is null )";
                else
                    strRowfilter = " (cWhCode='" + strcWhCode + "' AND cPosCode='" + strcPosCode + "' AND cInvCode='" + strcinvCode + "' AND cBatch='" + strSHBacthNo + "' AND iMassDate='" + strValidDate + "' AND dVDate='" + strEndDate + "' )";
                //
                dsAll.Tables["InvPositionSum"].DefaultView.RowFilter = strRowfilter;
                //
                if (dsAll.Tables["InvPositionSum"].DefaultView.Count > 0)
                {
                    for (int i = 0; i < dsAll.Tables["InvPositionSum"].DefaultView.Count; i++)
                    {
                        if (decQtyCheck == 0)
                            break;
                        decimal decQtyItem = dsAll.Tables["InvPositionSum"].DefaultView[i]["iQuantity"] == DBNull.Value ? 0 : (decimal)dsAll.Tables["InvPositionSum"].DefaultView[i]["iQuantity"];
                        //
                        if (decQtyCheck < decQtyItem)
                        {
                            dsAll.Tables["InvPositionSum"].DefaultView[i]["iQuantity"] = Math.Round(decQtyItem - decQtyCheck, 2);
                            //
                            dsAll.Tables["InvPositionSum"].DefaultView[i].EndEdit();
                            break;
                        }
                        else
                        {
                            dsAll.Tables["InvPositionSum"].DefaultView[i]["iQuantity"] = 0;
                            //
                            dsAll.Tables["InvPositionSum"].DefaultView[i].EndEdit();
                            decQtyCheck = Math.Round(decQtyCheck - decQtyItem, 2);
                        }
                    }
                }
            }
            #endregion
            #region 调整后货位的记录增加，或者增加对应记录的数量
            foreach (DataRow drv in drSelctdtRealQtyAFter)
            {
                string strcinvCode = drv["cInvCode"].ToString();
                string strcPosCode = GetwhOrPoCodeAndName(drv["cPosCode"].ToString(), 0);
                string strSHBacthNo = drv["SHBacthNo"].ToString();
                string strEndDate = drv["EndDate"].ToString();
                string strValidDate = drv["ValidDate"].ToString();
                string strcWhCode = GetwhOrPoCodeAndName(ds.Tables[0].DefaultView[0]["StorageName"].ToString(), 0);
                decimal decQtyCheck = drv["Quantity"] == DBNull.Value ? 0 : (decimal)drv["Quantity"];
                //筛选条件
                string strRowfilter = string.Empty;
                if (strValidDate == "")
                    strRowfilter = " (cWhCode='" + strcWhCode + "' AND cPosCode='" + strcPosCode + "' AND cInvCode='" + strcinvCode + "' AND cBatch='" + strSHBacthNo + "' AND iMassDate is null AND dVDate is null )";
                else
                    strRowfilter = " (cWhCode='" + strcWhCode + "' AND cPosCode='" + strcPosCode + "' AND cInvCode='" + strcinvCode + "' AND cBatch='" + strSHBacthNo + "' AND iMassDate='" + strValidDate + "' AND dVDate='" + strEndDate + "' )";
                //
                dsAll.Tables["InvPositionSum"].DefaultView.RowFilter = strRowfilter;
                //
                if (dsAll.Tables["InvPositionSum"].DefaultView.Count > 0)
                {
                    decimal decQtyItem = dsAll.Tables["InvPositionSum"].DefaultView[0]["iQuantity"] == DBNull.Value ? 0 : (decimal)dsAll.Tables["InvPositionSum"].DefaultView[0]["iQuantity"];
                    //
                    dsAll.Tables["InvPositionSum"].DefaultView[0]["iQuantity"] = Math.Round(decQtyItem + decQtyCheck, 2);
                    dsAll.Tables["InvPositionSum"].DefaultView[0].EndEdit();
                }
                else
                {
                    DataRow drnew = dsAll.Tables["InvPositionSum"].NewRow();
                    drnew["cWhCode"] = strcWhCode;
                    drnew["cPosCode"] = strcPosCode;
                    drnew["cInvCode"] = strcinvCode;
                    drnew["iQuantity"] = decQtyCheck;
                    drnew["cBatch"] = strSHBacthNo;
                    drnew["iTrackid"] = 0;
                    if (drv["ValidDate"] != DBNull.Value)
                    {
                        int iValidDate = Convert.ToInt32(drv["ValidDate"]);
                        drnew["iMassDate"] = iValidDate;
                        if (drv["EndDate"] != DBNull.Value)
                        {
                            DateTime dtEnddate = Convert.ToDateTime(strEndDate);
                            iValidDate = 0 - iValidDate;
                            drnew["dMadeDate"] = dtEnddate.AddDays(iValidDate);
                            drnew["dVDate"] = dtEnddate;
                        }
                    }
                    drnew["iExpiratDateCalcu"] = 0;
                    drnew.EndEdit();
                    dsAll.Tables["InvPositionSum"].Rows.Add(drnew);
                }
            }
            #endregion
            #endregion
            #region 获取最大ID UA_Identity 用来存储 主表ID的最大值和细表子表ID的最大值   VoucherHistory存储单据编码的最大流水号
            List<DataTableName> dtnMaxList = new List<DataTableName>();
            DataTableName dtnMaxID = new DataTableName();
            dtnMaxID.strSelectSQL = "SELECT *FROM ufsystem.dbo.UA_Identity WHERE  cAcc_Id='" + strZT + "' AND cVouchType='ad'";
            dtnMaxID.strTableName = "UA_Identity";
            dtnMaxList.Add(dtnMaxID);
            //
            dtnMaxID = new DataTableName();
            dtnMaxID.strSelectSQL = " SELECT *FROM " + strYongYouDBName + ".dbo.VoucherHistory WHERE  CardNumber=( SELECT TOP 1 CardNum  FROM " + strYongYouDBName + ".dbo.VoucherItems WHERE TableName='AdjustPVouch')";
            dtnMaxID.strTableName = "VoucherHistory";
            dtnMaxList.Add(dtnMaxID);
            DataSet dsUA_Identity = new DataSet();
            try
            {
                dsUA_Identity = CustomizableDesignBLL.GetData(dtnMaxList, false);
            }
            catch (Exception ex)
            {
                return "获取最大的编号出错：" + ex.Message;
            }
            int iFatherId = 0;
            int iChildID = 0;
            if (dsUA_Identity.Tables["UA_Identity"].DefaultView.Count > 0)
            {
                if (dsUA_Identity.Tables["UA_Identity"].DefaultView[0]["iFatherId"] == DBNull.Value)
                    iFatherId = 0;
                else
                    iFatherId = Convert.ToInt32(dsUA_Identity.Tables["UA_Identity"].DefaultView[0]["iFatherId"].ToString());

                if (dsUA_Identity.Tables["UA_Identity"].DefaultView[0]["iChildId"] == DBNull.Value)
                    iChildID = 0;
                else
                    iChildID = Convert.ToInt32(dsUA_Identity.Tables["UA_Identity"].DefaultView[0]["iChildId"].ToString());
            }
            //
            int iMaxnumber = 0;
            if (dsUA_Identity.Tables["VoucherHistory"].DefaultView.Count > 0)
            {
                if (dsUA_Identity.Tables["VoucherHistory"].DefaultView[0]["cNumber"] == DBNull.Value)
                    iMaxnumber = 0;
                else
                    iMaxnumber = Convert.ToInt32(dsUA_Identity.Tables["VoucherHistory"].DefaultView[0]["cNumber"].ToString());
            }
            #endregion
            //主表ID最大流水号
            iFatherId = iFatherId + 1;
            //主表ID
            int id = iFatherId + 1000000000;
            //最大流水号
            iMaxnumber = iMaxnumber + 1;
            //调整单单据编码
            string strcVouchCode = iMaxnumber.ToString();
            //十位流水号
            while (strcVouchCode.Length < 10)
                strcVouchCode = "0" + strcVouchCode;
            #region 增加调整单主表记录
            DataRow drnewAdjustPVouch = dsAll.Tables["AdjustPVouch"].NewRow();
            drnewAdjustPVouch["cVouchCode"] = strcVouchCode;
            drnewAdjustPVouch["dDate"] = sDate;
            drnewAdjustPVouch["cWhCode"] = GetwhOrPoCodeAndName(ds.Tables[0].DefaultView[0]["StorageName"].ToString(), 0);
            drnewAdjustPVouch["cMaker"] = strUserCode;
            drnewAdjustPVouch["Id"] = id;
            drnewAdjustPVouch["VT_ID"] = 113;
            drnewAdjustPVouch["dnmaketime"] = DateTime.Now;
            drnewAdjustPVouch["csource"] = 1;
            drnewAdjustPVouch["iPrintCount"] = 0;
            drnewAdjustPVouch["csysbarcode"] = "||st19|" + strcVouchCode; //  条码 ||st19|+单号
            drnewAdjustPVouch["cDefine10"] = ds.Tables[0].DefaultView[0]["SerialNum"].ToString();
            //审批字段
            drnewAdjustPVouch["chandler"] = strUserCode;// 审核人
            drnewAdjustPVouch["dVeriDate"] = DateTime.Now.Date;// 审核日期
            drnewAdjustPVouch["dnverifytime"] = DateTime.Now;// 审核时间
            drnewAdjustPVouch["iswfcontrolled"] = 0;
            drnewAdjustPVouch.EndEdit();
            dsAll.Tables["AdjustPVouch"].Rows.Add(drnewAdjustPVouch);
            #endregion
            #region 增加子表记录
            for (int i = 0; i < ds.Tables["T_AdjustPVouchProduct"].DefaultView.Count; i++)
            {
                //子表ID最大流水号
                iChildID = iChildID + 1;
                //子表ID
                int autoid = iChildID + 1000000000;
                //
                string strcInvCode = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["cInvCode"].ToString();
                string strSHBacthNo = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["cBatch"].ToString();
                string strBeforPosition = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["BeforPosition"].ToString();
                string strBforePosiCode = GetwhOrPoCodeAndName(strBeforPosition, 0);
                string strAfterPosition = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["AfterPosition"].ToString();
                string strAfterPosiCode = GetwhOrPoCodeAndName(strAfterPosition, 0);
                string strBarCode = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["BarCode"].ToString();
                int iValidDate = -1;
                //失效日期
                DateTime dtEndDate = new DateTime(1999, 1, 1);
                bool bisNeedDate = false;
                DataRow[] drSelectBarCode = dsBarCode.Tables[0].Select("BarCode='" + strBarCode + "'");
                if (drSelectBarCode.Length > 0)
                {
                    bisNeedDate = drSelectBarCode[0]["EndDate"] == DBNull.Value ? false : true;
                    if (bisNeedDate)
                        dtEndDate = Convert.ToDateTime(drSelectBarCode[0]["EndDate"]);
                    //
                    if (drSelectBarCode[0]["ValidDate"] != DBNull.Value)
                        iValidDate = Convert.ToInt32(drSelectBarCode[0]["ValidDate"]);
                }
                //数量
                decimal decBarCount = 0;
                //
                if (ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["BarCount"] != DBNull.Value)
                {
                    decBarCount = Convert.ToDecimal(ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["BarCount"].ToString());
                }
                //件数
                decimal decNum = 0;
                //
                if (ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["Num"] != DBNull.Value)
                {
                    decNum = Convert.ToDecimal(ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["Num"].ToString());
                }
                //
                DataRow drnew = dsAll.Tables["AdjustPVouchs"].NewRow();
                drnew["ID"] = id;
                drnew["autoID"] = autoid;
                drnew["cDefine34"] = ds.Tables["T_AdjustPVouchProduct"].DefaultView[i]["SerialID"];
                drnew["cVouchCode"] = strcVouchCode;
                drnew["cInvCode"] = strcInvCode;
                drnew["cBPosCode"] = strBforePosiCode;
                drnew["cAPosCode"] = strAfterPosiCode;
                drnew["iQuantity"] = decBarCount;
                drnew["cBatch"] = strSHBacthNo;
                drnew["iNum"] = decNum;
                if (bisNeedDate)
                {
                    drnew["dDisDate"] = dtEndDate.ToString("yyyy-MM-dd");
                    drnew["iMassDate"] = iValidDate;
                    drnew["dMadeDate"] = dtEndDate.AddDays(0 - iValidDate).ToString("yyyy-MM-dd");
                    //   drnew["cMassUnit"] = "";  //保质期单位
                }
                drnew["irowno"] = (i + 1);
                drnew["cbsysbarcode"] = "||st19|" + strcVouchCode + "|" + (i + 1); // ||st19|单据编码|行号
                drnew.EndEdit();
                dsAll.Tables["AdjustPVouchs"].Rows.Add(drnew);
            }
            #endregion
            #region 根据调整单子表记录，生成对应的存货货位记录表
            for (int i = 0; i < dsAll.Tables["AdjustPVouchs"].DefaultView.Count; i++)
            {
                string strBeforPosition = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["cBPosCode"].ToString();
                string strAfterPosition = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["cAPosCode"].ToString();
                #region 调整前货位记录
                DataRow drnewBfore = dsAll.Tables["InvPosition"].NewRow();
                //
                drnewBfore["RdID"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["ID"];
                drnewBfore["RdsID"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["autoID"];
                drnewBfore["cWhCode"] = dsAll.Tables["AdjustPVouch"].DefaultView[0]["cWhCode"];
                drnewBfore["cPosCode"] = strBeforPosition;
                drnewBfore["cInvCode"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["cInvCode"];
                drnewBfore["cBatch"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["cBatch"];
                drnewBfore["dVDate"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["dDisDate"];
                drnewBfore["iQuantity"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["iQuantity"];
                drnewBfore["iNum"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["iNum"];
                drnewBfore["cHandler"] = dsAll.Tables["AdjustPVouch"].DefaultView[0]["cMaker"];
                drnewBfore["dDate"] = dsAll.Tables["AdjustPVouch"].DefaultView[0]["dDate"];
                drnewBfore["bRdFlag"] = 0;
                drnewBfore["cSource"] = "货位调整";
                drnewBfore["iTrackId"] = 0;
                drnewBfore["dMadeDate"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["dMadeDate"];
                drnewBfore["iMassDate"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["iMassDate"];
                drnewBfore["cMassUnit"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["cMassUnit"];
                drnewBfore["iExpiratDateCalcu"] = 0;
                drnewBfore["cvouchtype"] = "19";
                drnewBfore["dVouchDate"] = dsAll.Tables["AdjustPVouch"].DefaultView[0]["dDate"];
                //
                drnewBfore.EndEdit();
                dsAll.Tables["InvPosition"].Rows.Add(drnewBfore);
                #endregion
                #region 调整后货位记录
                DataRow drnewAfter = dsAll.Tables["InvPosition"].NewRow();
                //
                drnewAfter["RdID"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["ID"];
                drnewAfter["RdsID"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["autoID"];
                drnewAfter["cWhCode"] = dsAll.Tables["AdjustPVouch"].DefaultView[0]["cWhCode"];
                drnewAfter["cPosCode"] = strAfterPosition;
                drnewAfter["cInvCode"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["cInvCode"];
                drnewAfter["cBatch"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["cBatch"];
                drnewAfter["dVDate"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["dDisDate"];
                drnewAfter["iQuantity"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["iQuantity"];
                drnewAfter["iNum"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["iNum"];
                drnewAfter["cHandler"] = dsAll.Tables["AdjustPVouch"].DefaultView[0]["cMaker"];
                drnewAfter["dDate"] = dsAll.Tables["AdjustPVouch"].DefaultView[0]["dDate"];
                drnewAfter["bRdFlag"] = 1;
                drnewAfter["cSource"] = "货位调整";
                drnewAfter["iTrackId"] = 0;
                drnewAfter["dMadeDate"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["dMadeDate"];
                drnewAfter["iMassDate"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["iMassDate"];
                drnewAfter["cMassUnit"] = dsAll.Tables["AdjustPVouchs"].DefaultView[i]["cMassUnit"];
                drnewAfter["iExpiratDateCalcu"] = 0;
                drnewAfter["cvouchtype"] = "19";
                drnewAfter["dVouchDate"] = dsAll.Tables["AdjustPVouch"].DefaultView[0]["dDate"];
                //
                drnewAfter.EndEdit();
                dsAll.Tables["InvPosition"].Rows.Add(drnewAfter);
                #endregion

            }
            #endregion
            //
            #region 保存后回刷数据
            DataTableName.SaveAfterSQL saveSql = new DataTableName.SaveAfterSQL();
            // ad  对应 货位调整单
            saveSql.strSQL = "UPDATE ufsystem.dbo.UA_Identity SET iFatherId='" + iFatherId + "',iChildId='" + iChildID + "' WHERE cAcc_Id='" + strZT + "' AND cVouchType='ad'";
            dtnlist[3].SaveAfterSQLList.Add(saveSql);
            saveSql = new DataTableName.SaveAfterSQL();
            //0313 是 货位调整单对应的单据编码 
            saveSql.strSQL = " UPDATE " + strYongYouDBName + ".dbo.VoucherHistory SET  cNumber='" + iMaxnumber + "'  WHERE CardNumber='0313' ";
            dtnlist[3].SaveAfterSQLList.Add(saveSql);
            #endregion
            //
            try
            {
                CustomizableDesignBLL.SaveData(dsAll, dtnlist);
            }
            catch (Exception ex)
            {
                return "保存生成的调整单记录失败，生成失败：" + ex.Message;
            }
            //
            return strRet;
        }
        #endregion



        #region 登陆判断
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sSubId">AS</param>
        /// <param name="sAccID">999</param>
        /// <param name="sYear">2010</param>
        /// <param name="sUserID">demo</param>
        /// <param name="sPassword">DEMO</param>
        /// <param name="sDate">2010-11-11</param>
        /// <param name="sServer">127.0.0.1</param>
        /// <param name="sSerial"></param>
        /// <returns></returns>
        public string u8Login(string sSubId, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string sSerial)
        {
            //strLoginMsg.IndexOf("您本次登录将自动清退上一次登录") 
            //return "";
            string strMsg = "";
            try
            {
                U8Login.clsLogin u8Login = new U8Login.clsLogin();

                if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
                {
                    strMsg = "登陆失败，原因：" + u8Login.ShareString;
                    Marshal.FinalReleaseComObject(u8Login);
                    return strMsg;
                }
                Marshal.FinalReleaseComObject(u8Login);
                return strMsg;
            }
            catch (Exception ex)
            {
                return "出错：" + ex.Message;
            }
        }
        #endregion

        private string GetObject(object obj)
        {
            if (obj == null)
                return "null";
            if (obj == DBNull.Value)
                return "DBNull.Value";
            return obj.ToString();
        }
        //
        #region CS端产成品入库API
        public string CSProductInstorage(DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, string strPKValue)
        {
            if (ds.Tables[0].DefaultView.Count == 0 || ds.Tables["V_ProudctInStorageDetail"].DefaultView.Count == 0)
            {
                return "API接口传入的成品入库数据错误，数据行数为0!";
            }
            // 返回值
            string strRet = "";
            //
            DateTime dtCreateDate = DateTime.Now;
            ////
            //string strYongYouDBName = "UFDATA_" + strZT + "_2016";
            //string sAccID = strZT;
            //string sYear = dtCreateDate.ToString("yyyy");
            //string sUserID = "sb01";
            //string sPassword = "";
            //string sDate = dtCreateDate.ToString("yyyy-MM-dd");
            //string sServer = "127.0.0.1";// strServerIP;
            //
            #region 构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/ProductIn/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ProductIn/Add");
            #endregion

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：10
            broker.AssignNormalValue("sVouchType", "10");

            //给BO表头参数DomHead赋值，此BO参数的业务类型为产成品入库单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            DomHead[0]["ccode"] = "testsqg"; //入库单号，string类型  这个会自动生成 输了也白输 --sqg
            DomHead[0]["ddate"] = dtCreateDate.ToString("yyyy-MM-dd"); //入库日期，DateTime类型


            DomHead[0]["iproorderid"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[0]["MoId"].ToString(); //生产订单ID，string类型
            DomHead[0]["cmpocode"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[0]["SCOrderNum"].ToString(); //生产订单号，string类型 入库类型

            DomHead[0]["cwhcode"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[0]["cwhcode"].ToString(); //仓库编码，string类型
            DomHead[0]["cwhname"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[0]["cwhname"].ToString(); //仓库，string类型

            DomHead[0]["iverifystate"] = "0"; //iverifystate，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，string类型
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            DomHead[0]["cmemo"] = "CS生成"; //备注，string类型
            DomHead[0]["cmaker"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[0]["CreaterName"].ToString(); //制单人，string类型
            DomHead[0]["cbustype"] = "成品入库"; //业务类型，int类型
            DomHead[0]["csource"] = "生产订单"; //单据来源，int类型
            DomHead[0]["brdflag"] = "1"; //收发标志，string类型
            DomHead[0]["cvouchtype"] = "10"; //单据类型，string类型
            DomHead[0]["crdcode"] = "103"; //入库类别编码，string类型
            DomHead[0]["cdepcode"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[0]["MDeptCode"].ToString(); //部门编码，string类型
            DomHead[0]["vt_id"] = "63"; //模版号，int类型
            //中间数据库表的主键
            DomHead[0]["cdefine10"] = strPKValue;
            #region 暂时没用的
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型
            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            ////DomHead[0]["dchkdate"] = ""; //检验日期，DateTime类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["cpspcode"] = ""; //产品，string类型
            //DomHead[0]["cprobatch"] = ""; //生产批号，string类型


            //DomHead[0]["cdepname"] = ""; //部门，string类型
            //DomHead[0]["crdname"] = ""; //入库类别，string类型
            //DomHead[0]["dveridate"] = ""; //审核日期，DateTime类型

            //DomHead[0]["cchkperson"] = ""; //检验员，string类型

            //DomHead[0]["chandler"] = ""; //审核人，string类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型

            //DomHead[0]["cpersonname"] = ""; //业务员，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            // DomHead[0]["csource"] = "库存"; //单据来源，int类型  空白的

            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型

            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            //DomHead[0]["cdefine10"] = ""; //表头自定义项10，string类型

            //DomHead[0]["cpersoncode"] = ""; //业务员编码，string类型

            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            #endregion
            //给BO表体参数domBody赋值，此BO参数的业务类型为产成品入库单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            //domBody.RowCount = ds.Tables["V_ProudctInStorageDetail"].DefaultView.Count; //设置BO对象行数
            domBody.RowCount = 1; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            for (int iRow = 0; iRow < ds.Tables["V_ProudctInStorageDetail"].DefaultView.Count; iRow++)
            {
                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = "0"; //主关键字段，int类型
                domBody[iRow]["cinvcode"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["ProductCode"].ToString(); //产品编码，string类型
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                domBody[iRow]["irowno"] = iRow + 1; //行号，string类型

                //
                domBody[iRow]["cdefine34"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["SerialID"].ToString(); //表体自定义项3，string类型
                domBody[iRow]["cmocode"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["SCOrderNum"].ToString(); //生产订单号，string类型
                domBody[iRow]["impoids"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["MoDId"].ToString(); //生产订单子表ID，int类型
                domBody[iRow]["imoseq"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["SortSeq"].ToString();  //生产订单行号，string类型

                decimal decSCQuantity = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["SCQuantity"] == DBNull.Value ? 0 : Convert.ToDecimal(ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["SCQuantity"]);
                domBody[iRow]["inquantity"] = Decimal.Round(decSCQuantity, 2); //应收数量，double类型 生产订单数量
                //domBody[iRow]["cbatchproperty8"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["LuCode"].ToString();  //批次属性8，string类型  炉批号
                decimal decLZQuantity = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["Quantity"] == DBNull.Value ? 0 : (decimal)ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["Quantity"];
                domBody[iRow]["iquantity"] = Decimal.Round(decLZQuantity, 2); //数量，double类型
                //domBody[iRow]["cbatch"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["PiHao"].ToString();  //批号，string类型
                domBody[iRow]["cposition"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["PostCode"].ToString();  //货位编码，string类型
                domBody[iRow]["id"] = "0"; //与主表关联项，int类型
                //
                domBody[iRow]["cname"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["CostItemName"].ToString(); //项目，string类型
                domBody[iRow]["citemcode"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["CostItemCode"].ToString();//项目编码，string类型

                //domBody[iRow]["iopseq"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["OpSeq"].ToString(); //工序行号，string类型
                //domBody[iRow]["copdesc"] = ds.Tables["V_ProudctInStorageDetail"].DefaultView[iRow]["Description"].ToString(); //工序说明，string类型
                //
                domBody[iRow]["citem_class"] = "99"; //项目大类编码，string类型
                domBody[iRow]["citemcname"] = "成本对象"; //项目大类名称，string类型
                domBody[iRow]["bcosting"] = "1"; //是否核算，string类型
                domBody[iRow]["cmworkcentercode"] = "0015"; //工作中心编码，string类型
                domBody[iRow]["isotype"] = "0"; //需求跟踪方式，int类型
                domBody[iRow]["bvmiused"] = "0"; //代管消耗标识，int类型
                domBody[iRow]["iordertype"] = "0"; //销售订单类别，int类型
                domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                //  domBody[iRow]["cbmemo"] = "SQG测试"; //备注，string类型
                #region 暂时不需要注视掉
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["cbaccounter"] = ""; //记账人，string类型
                //domBody[iRow]["ccheckcode"] = ""; //检验单号，string类型
                //domBody[iRow]["icheckidbaks"] = ""; //检验单子表id，string类型
                //domBody[iRow]["crejectcode"] = ""; //不良品处理单号，string类型
                //domBody[iRow]["irejectids"] = ""; //不良品处理单id，string类型
                //domBody[iRow]["ccheckpersonname"] = ""; //检验员，string类型
                //domBody[iRow]["dcheckdate"] = ""; //检验日期，string类型
                //domBody[iRow]["ccheckpersoncode"] = ""; //检验员编码，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["outcopiedquantity"] = ""; //已复制数量，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["cbmemo"] = ""; //备注，string类型

                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["cservicecode"] = ""; //服务单号，string类型
                //domBody[iRow]["cplanlotcode"] = ""; //计划批号，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型
                //domBody[iRow]["iinvsncount"] = ""; //已指定序列号量，string类型

                /***************************** 以下是非必输字段 ****************************/

                //domBody[iRow]["cinvaddcode"] = ""; //产品代码，string类型
                //domBody[iRow]["cinvname"] = ""; //产品名称，string类型
                //domBody[iRow]["cinvstd"] = ""; //规格型号，string类型
                //domBody[iRow]["cinvm_unit"] = ""; //主计量单位，string类型
                //domBody[iRow]["cinva_unit"] = ""; //库存单位，string类型
                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型

                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，double类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，double类型
                //domBody[iRow]["cfree2"] = ""; //存货自由项2，string类型

                //domBody[iRow]["iinvexchrate"] = ""; //换算率，double类型
                //domBody[iRow]["inum"] = ""; //件数，double类型

                //domBody[iRow]["iunitcost"] = ""; //单价，double类型
                //domBody[iRow]["iprice"] = ""; //金额，double类型
                //domBody[iRow]["ipunitcost"] = ""; //计划单价，double类型
                //domBody[iRow]["ipprice"] = ""; //计划金额，double类型
                //domBody[iRow]["dvdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["isoutquantity"] = ""; //累计出库数量，double类型
                //domBody[iRow]["isoutnum"] = ""; //累计出库件数，double类型
                //domBody[iRow]["dsdate"] = ""; //结算日期，DateTime类型
                //domBody[iRow]["ifquantity"] = ""; //实际数量，double类型
                //domBody[iRow]["ifnum"] = ""; //实际件数，double类型
                //domBody[iRow]["cvouchcode"] = ""; //对应入库单id，string类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，double类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，double类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，double类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型

                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，DateTime类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型

                //domBody[iRow]["innum"] = ""; //应收件数，double类型
                //domBody[iRow]["dmadedate"] = ""; //生产日期，DateTime类型

                //domBody[iRow]["icheckids"] = ""; //检验单子表ID，int类型
                //domBody[iRow]["isodid"] = ""; //销售订单子表ID，string类型

                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //domBody[iRow]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["cposname"] = ""; //货位，string类型
                //domBody[iRow]["cmolotcode"] = ""; //生产批号，string类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型

                //domBody[iRow]["cvmivencode"] = ""; //代管商代码，string类型
                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型

                //domBody[iRow]["ivmisettlequantity"] = ""; //代管挂账确认单数量，double类型
                //domBody[iRow]["ivmisettlenum"] = ""; //代管挂账确认单件数，double类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型

                //domBody[iRow]["iorderdid"] = ""; //iorderdid，int类型
                //domBody[iRow]["iordercode"] = ""; //销售订单号，string类型
                //domBody[iRow]["iorderseq"] = ""; //销售订单行号，string类型

                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，string类型
                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["ibondedsumqty"] = ""; //累计保税处理抽取数量，string类型

                //domBody[iRow]["cmworkcenter"] = ""; //工作中心，string类型

                //domBody[iRow]["cdefine34"] = ""; //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["itrids"] = ""; //特殊单据子表标识，double类型
                //domBody[iRow]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //表体自定义项6，double类型
                #endregion
            }

            //
            #region 调用API处理

            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRet = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRet = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRet = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRet;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return "失败！" + errMsgRet;
            }
            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();

            #endregion
            return strRet;
        }
        #endregion

        #region CS端调拨单
        public string CSDHD(DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {
            if (ds.Tables[0].DefaultView.Count == 0 || ds.Tables["T_ProductOutStorageProduct"].DefaultView.Count == 0)
            {
                return "API接口传入的调拨单数据错误，数据行数为0!";
            }
            // 返回值
            string strRet = "";
            //
            DateTime dtCreateDate = DateTime.Now;
            //
            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/TransVouch/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/TransVouch/Add");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：12
            broker.AssignNormalValue("sVouchType", "12");


            //给BO表头参数DomHead赋值，此BO参数的业务类型为调拨单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            DomHead[0]["ctvcode"] = "test"; //单据号，string类型
            DomHead[0]["dtvdate"] = dtCreateDate.ToString("yyyy-MM-dd"); //日期，DateTime类型
            DomHead[0]["cwhname"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["ZCWhName"].ToString(); //转出仓库，string类型
            DomHead[0]["cwhname_1"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["ZRWhName"].ToString(); //转入仓库，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            DomHead[0]["iverifystate"] = "0"; //iverifystate，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，string类型
            DomHead[0]["cbustype"] = ""; //业务类型，string类型
            //DomHead[0]["csourcecodels"] = ""; //零售来源单号，string类型
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            DomHead[0]["ctranrequestcode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["OrderNUm"].ToString(); //调拨申请单号，string类型
            //DomHead[0]["cdepname_1"] = ""; //转出部门，string类型
            //DomHead[0]["cdepname"] = ""; //转入部门，string类型
            //DomHead[0]["crdname_1"] = ""; //出库类别，string类型
            //DomHead[0]["crdname"] = ""; //入库类别，string类型
            //DomHead[0]["cpersonname"] = ""; //经手人，string类型
            //DomHead[0]["dverifydate"] = ""; //审核日期，DateTime类型
            DomHead[0]["ctvmemo"] = "CS中间表生成"; //备注，string类型
            //DomHead[0]["parentscrp"] = ""; //母件损耗率(％)，double类型
            DomHead[0]["csource"] = "1"; //单据来源，int类型
            //DomHead[0]["iamount"] = ""; //现存量，string类型
            DomHead[0]["cmaker"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["CreaterName"].ToString(); //制单人，string类型
            //DomHead[0]["cverifyperson"] = ""; //审核人，string类型
            //DomHead[0]["cfree1"] = ""; //自由项1，string类型
            //DomHead[0]["cfree2"] = ""; //自由项2，string类型
            //DomHead[0]["cfree3"] = ""; //自由项3，string类型
            //DomHead[0]["cfree4"] = ""; //自由项4，string类型
            //DomHead[0]["cfree5"] = ""; //自由项5，string类型
            //DomHead[0]["cfree6"] = ""; //自由项6，string类型
            //DomHead[0]["cfree7"] = ""; //自由项7，string类型
            //DomHead[0]["cfree8"] = ""; //自由项8，string类型
            //DomHead[0]["cfree9"] = ""; //自由项9，string类型
            //DomHead[0]["cfree10"] = ""; //自由项10，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            //DomHead[0]["codepcode"] = "0501"; //转出部门编码，string类型  不用 是空值
            //DomHead[0]["cidepcode"] = "0502"; //转入部门编码，string类型  不用 是空值
            //DomHead[0]["cpersoncode"] = ""; //经手人编码，string类型
            DomHead[0]["cordcode"] = "204"; //出库类别编码，string类型  sqg 写死就可以了固定值
            DomHead[0]["cirdcode"] = "104"; //入库类别编码，string类型  sqg 写死就可以了固定值
            DomHead[0]["ciwhcode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["ZRWhCode"].ToString(); //转入仓库编码，string类型
            DomHead[0]["cowhcode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["ZCWhCode"].ToString(); //转出仓库编码，string类型
            //DomHead[0]["cmpocode"] = ""; //订单号，string类型
            //DomHead[0]["cpspcode"] = ""; //产品结构，string类型
            //DomHead[0]["btransflag"] = ""; //是否传递，string类型
            DomHead[0]["vt_id"] = "89"; //模版号，int类型
            DomHead[0]["iquantity"] = "0"; //产量，double类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["iproorderid"] = ""; //生产订单ID，string类型
            //DomHead[0]["cversion"] = ""; //版本号／替代标识，string类型
            //DomHead[0]["bomid"] = ""; //bomid，string类型
            //DomHead[0]["cordertype"] = ""; //订单类型，string类型
            //DomHead[0]["cinvname"] = ""; //产品名称，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            DomHead[0]["itransflag"] = "正向"; //调拨方向，int类型
            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            DomHead[0]["cdefine10"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["SerialNum"].ToString(); //表头自定义项10，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型

            //给BO表体参数domBody赋值，此BO参数的业务类型为调拨单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = ds.Tables["T_ProductOutStorageProduct"].DefaultView.Count; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            for (int iRow = 0; iRow < ds.Tables["T_ProductOutStorageProduct"].DefaultView.Count; iRow++)
            {
                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = "0"; //主关键字段，int类型
                domBody[iRow]["cinvcode"] = ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["ProductCode"].ToString(); //存货编码，string类型
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //批次属性7，string类型
                //domBody[iRow]["cbatchproperty8"] = ""; //批次属性8，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //批次属性9，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //批次属性10，string类型
                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["cbmemo"] = ""; //备注，string类型
                domBody[iRow]["irowno"] = (iRow + 1).ToString(); //行号，string类型
                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //批次属性1，string类型
                //domBody[iRow]["iinvsncount"] = ""; //序列号个数，string类型
                //domBody[iRow]["cbatchproperty2"] = ""; //批次属性2，string类型
                //domBody[iRow]["cbatchproperty3"] = ""; //批次属性3，string类型
                //domBody[iRow]["cbatchproperty4"] = ""; //批次属性4，string类型
                //domBody[iRow]["cbatchproperty5"] = ""; //批次属性5，string类型
                //domBody[iRow]["cbatchproperty6"] = ""; //批次属性6，string类型
                //domBody[iRow]["ipresent"] = ""; //现存量，string类型
                //domBody[iRow]["ipresentnum"] = ""; //现存件数，string类型
                //domBody[iRow]["iavaquantity"] = ""; //可用量，string类型
                //domBody[iRow]["iavanum"] = ""; //可用件数，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["cbsourcecodels"] = ""; //零售来源单号，string类型
                //domBody[iRow]["cmolotcode"] = ""; //生产批号，string类型
                //domBody[iRow]["cinvoucherlineid"] = ""; //源单行ID，string类型
                //domBody[iRow]["cinvouchercode"] = ""; //源单号，string类型
                //domBody[iRow]["cinvouchertype"] = ""; //源单类型，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型

                /***************************** 以下是非必输字段 ****************************/
                //domBody[iRow]["issodid"] = ""; //销售订单子表ID，string类型
                //domBody[iRow]["idsodid"] = ""; //目标销售订单子表ID，string类型
                // domBody[iRow]["itrids"] = "1000012041"; //调拨申请单子表ID，int类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cinvaddcode"] = ""; //存货代码，string类型
                //domBody[iRow]["cinvname"] = ""; //存货名称，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //domBody[iRow]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iRow]["dmadedate"] = ""; //生产日期，DateTime类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["cinvstd"] = ""; //规格型号，string类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["cdsocode"] = ""; //目标需求跟踪号，string类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["cinvm_unit"] = ""; //主计量单位，string类型
                //domBody[iRow]["cinposname"] = ""; //调入货位，string类型
                //domBody[iRow]["cinposcode"] = ""; //调入货位编码，string类型
                //domBody[iRow]["coutposname"] = ""; //调出货位，string类型
                //domBody[iRow]["coutposcode"] = ""; //调出货位编码，string类型
                // domBody[iRow]["cvmivencode"] = "0571189"; //代管商代码，string类型
                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cfree2"] = ""; //存货自由项2，string类型
                bool bInvBatch = ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["bInvBatch"] == DBNull.Value ? false : (bool)ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["bInvBatch"];
                if (bInvBatch)
                    domBody[iRow]["ctvbatch"] = ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["ctvbatch"].ToString(); //批号，string类型
                //domBody[iRow]["itvnum"] = ""; //件数，double类型
                //domBody[iRow]["iinvexchrate"] = ""; //换算率，double类型

                decimal decQty = ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["Quantity"] == DBNull.Value ? 0 : (decimal)ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["Quantity"];
                domBody[iRow]["itvquantity"] = Decimal.Round(decQty, 2); //数量，double类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["itvacost"] = ""; //单价，double类型
                //domBody[iRow]["csdemandmemo"] = ""; //需求分类代号说明，string类型
                //domBody[iRow]["cddemandmemo"] = ""; //目标需求分类代号说明，string类型
                //domBody[iRow]["comcode"] = ""; //委外订单号，string类型
                //domBody[iRow]["cmocode"] = ""; //生产订单号，string类型
                //domBody[iRow]["invcode"] = ""; //产品编码，string类型
                //domBody[iRow]["invname"] = ""; //产品，string类型
                //domBody[iRow]["imoseq"] = ""; //生产订单行号，string类型
                //domBody[iRow]["iomids"] = ""; //iomids，int类型
                //domBody[iRow]["imoids"] = ""; //imoids，int类型
                domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，string类型
                //domBody[iRow]["itvaprice"] = ""; //金额，double类型
                //domBody[iRow]["itvpcost"] = ""; //计划单价／售价，double类型
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["issotype"] = ""; //需求跟踪方式，int类型
                //domBody[iRow]["idsoseq"] = ""; //目标需求跟踪行号，string类型
                //domBody[iRow]["idsotype"] = ""; //目标需求跟踪方式，int类型
                //domBody[iRow]["bcosting"] = ""; //是否核算，string类型
                //domBody[iRow]["itvpprice"] = ""; //计划金额／售价金额，double类型
                //domBody[iRow]["cinva_unit"] = ""; //库存单位，string类型
                //domBody[iRow]["ddisdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型
                domBody[iRow]["cposition"] = ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["PostCode"].ToString(); //货位编码，string类型
                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型
                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["rdsid"] = ""; //对应入库单id，int类型
                domBody[iRow]["cdefine34"] = ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["SerialID"].ToString(); ; //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["impoids"] = ""; //生产订单子表Id，int类型
                //domBody[iRow]["ctvcode"] = ""; //单据号，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //表体自定义项6，double类型
                //domBody[iRow]["citemcode"] = ""; //项目编码，string类型
                //domBody[iRow]["cname"] = ""; //项目，string类型
                //domBody[iRow]["citem_class"] = ""; //项目大类编码，string类型
                //domBody[iRow]["fsalecost"] = ""; //零售单价，double类型
                //domBody[iRow]["fsaleprice"] = ""; //零售金额，double类型
                //domBody[iRow]["citemcname"] = ""; //项目大类名称，string类型
                //domBody[iRow]["igrossweight"] = ""; //毛重，string类型
                //domBody[iRow]["inetweight"] = ""; //净重，string类型

            }

            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRet = "系统异常：" + sysEx.Message;

                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRet = "系统异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRet = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRet;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                //获取out/inout参数值

                //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                strRet = "失败！" + errMsgRet;
            }
            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));
            //结束本次调用，释放API资源
            broker.Release();
            return strRet;
        }
        #endregion
        #region CS端销售出库单
        public string CSExpOutsotrage(DataSet ds, string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer)
        {
            if (ds.Tables[0].DefaultView.Count == 0 || ds.Tables["T_ProductOutStorageProduct"].DefaultView.Count == 0)
            {
                return "API接口传入的调拨单数据错误，数据行数为0!";
            }
            // 返回值
            string strRet = "";
            //
            DateTime dtCreateDate = DateTime.Now;

            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";

            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/saleout/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/saleout/Add");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：32
            broker.AssignNormalValue("sVouchType", "32");

            //给BO表头参数DomHead赋值，此BO参数的业务类型为销售出库单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            DomHead[0]["ccode"] = "2016080401001"; //出库单号，string类型
            DomHead[0]["ddate"] = dtCreateDate.ToString("yyyy-MM-dd"); //出库日期，DateTime类型
            DomHead[0]["cwhname"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["ZCWhName"].ToString();  //仓库，string类型
            DomHead[0]["cbustype"] = "普通销售"; //业务类型，int类型
            DomHead[0]["iverifystate"] = "0"; //iverifystate，int类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，int类型
            DomHead[0]["ccusabbname"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["ClientName"].ToString();  //客户，string类型
            DomHead[0]["cmaker"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["CreaterName"].ToString(); //制单人，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            DomHead[0]["cvouchtype"] = "32"; //单据类型，string类型
            DomHead[0]["cwhcode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["ZCWhCode"].ToString();  //仓库编码，string类型
            DomHead[0]["csource"] = "发货单"; //单据来源，int类型
            DomHead[0]["brdflag"] = "0"; //收发标志，int类型
            DomHead[0]["ccuscode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["ClientCode"].ToString(); //客户编码，string类型
            DomHead[0]["bisstqc"] = "0"; //库存期初标识，string类型
            DomHead[0]["ccusname"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["ClientName"].ToString(); //客户名称，string类型
            //DomHead[0]["csourcels"] = ""; //单据来源，string类型
            //DomHead[0]["ccusdefine1"] = ""; //客户自定义项1，string类型
            //DomHead[0]["ccusdefine2"] = ""; //客户自定义项2，string类型
            //DomHead[0]["ccusdefine3"] = ""; //客户自定义项3，string类型
            //DomHead[0]["ccusdefine4"] = ""; //客户自定义项4，string类型
            //DomHead[0]["ccusdefine5"] = ""; //客户自定义项5，string类型
            //DomHead[0]["ccusdefine6"] = ""; //客户自定义项6，string类型
            //DomHead[0]["ccusdefine7"] = ""; //客户自定义项7，string类型
            //DomHead[0]["ccusdefine8"] = ""; //客户自定义项8，string类型
            //DomHead[0]["ccusdefine9"] = ""; //客户自定义项9，string类型
            //DomHead[0]["ccusdefine12"] = ""; //客户自定义项12，string类型
            //DomHead[0]["ccusdefine13"] = ""; //客户自定义项13，string类型
            //DomHead[0]["ccusdefine14"] = ""; //客户自定义项14，string类型
            //DomHead[0]["ccusdefine15"] = ""; //客户自定义项15，string类型
            //DomHead[0]["ccusdefine16"] = ""; //客户自定义项16，string类型
            //DomHead[0]["csysbarcode"] = ""; //单据条码，string类型
            //DomHead[0]["ccusdefine10"] = ""; //客户自定义项10，string类型
            //DomHead[0]["ccusdefine11"] = ""; //客户自定义项11，string类型
            //DomHead[0]["chinvsn"] = ""; //序列号，string类型
            DomHead[0]["iflowid"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["iflowid"].ToString(); //流程模式ID，string类型
            //DomHead[0]["cflowname"] = "普通销售"; //流程模式描述，string类型
            //DomHead[0]["cinvoicecompany"] = "000"; //开票单位编码，string类型
            //DomHead[0]["cinvoicecompanyabbname"] = "000"; //开票单位简称，string类型
            //DomHead[0]["febweight"] = ""; //重量，string类型
            //DomHead[0]["cebweightunit"] = ""; //重量单位，string类型
            //DomHead[0]["cebexpresscode"] = ""; //快递单号，string类型
            //DomHead[0]["bscanexpress"] = ""; //是否确认快递单号，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            DomHead[0]["crdname"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["crdname"].ToString(); ; //出库类别，string类型 cRdName
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            DomHead[0]["cbuscode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["SerialNum"].ToString(); //业务号，string类型 发货单号
            //DomHead[0]["cdepname"] = ""; //销售部门，string类型
            DomHead[0]["cpersonname"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["cpersonname"].ToString();  //业务员，string类型
            //DomHead[0]["dveridate"] = ""; //审核日期，DateTime类型
            DomHead[0]["cmemo"] = "CS发货单中间表生成"; //备注，string类型
            //DomHead[0]["chandler"] = ""; //审核人，string类型
            //DomHead[0]["caccounter"] = ""; //记账人，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["ccusperson"] = ""; //客户联系人，string类型
            //DomHead[0]["ccusphone"] = ""; //客户电话，string类型
            //DomHead[0]["ccushand"] = ""; //客户手机，string类型
            //DomHead[0]["ccusaddress"] = ""; //客户地址，string类型
            //DomHead[0]["contactphone"] = ""; //客户联系人电话，string类型
            //DomHead[0]["contactmobile"] = ""; //客户联系人手机，string类型
            //DomHead[0]["cdeliverunit"] = ""; //收货单位，string类型
            //DomHead[0]["ccontactname"] = ""; //收货单位联系人，string类型
            //DomHead[0]["cofficephone"] = ""; //收货单位联系人电话，string类型
            //DomHead[0]["cmobilephone"] = ""; //收货单位联系人手机，string类型
            //DomHead[0]["cpsnophone"] = ""; //业务员电话，string类型
            //DomHead[0]["cpsnmobilephone"] = ""; //业务员手机，string类型
            //DomHead[0]["cstname"] = ""; //销售类型，string类型
            DomHead[0]["cdepcode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["cdepcode"].ToString(); //部门编码，string类型
            DomHead[0]["crdcode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["crdcode"].ToString(); //出库类别编码，string类型
            DomHead[0]["cstcode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["cstcode"].ToString(); //销售类型编码，string类型
            //DomHead[0]["cvouchname"] = ""; //单据类名，int类型
            DomHead[0]["cdlcode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["dlid"].ToString(); //发货单id，string类型
            //DomHead[0]["cvenabbname"] = ""; //供应商，string类型
            DomHead[0]["cpersoncode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["cpersoncode"].ToString(); //业务员编码，string类型
            //DomHead[0]["cbillcode"] = ""; //发票id，string类型
            //DomHead[0]["cvencode"] = ""; //供应商代码，string类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["gspcheck"] = ""; //gsp复核标志，string类型
            //DomHead[0]["isalebillid"] = ""; //发票号，string类型
            //DomHead[0]["iarriveid"] = "0000000105"; //发货单号，string类型
            //DomHead[0]["dchkdate"] = ""; //检验日期，DateTime类型
            //DomHead[0]["cchkperson"] = ""; //检验员，string类型
            DomHead[0]["vt_id"] = "87"; //模版号，int类型
            DomHead[0]["cshipaddress"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["cshipaddress"].ToString(); //发货地址，string类型
            DomHead[0]["caddcode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["caddcode"].ToString(); //发货地址编码，string类型
            //DomHead[0]["cchkcode"] = ""; //检验单号，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            DomHead[0]["cdefine9"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["cdefine9"].ToString(); //表头自定义项9，string类型  是否送货上门
            DomHead[0]["cdefine10"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["cdefine10"].ToString(); //表头自定义项10，string类型  承运电话
            DomHead[0]["cdefine11"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["cdefine11"].ToString();  //表头自定义项11，string类型  联系人加电话  格式是 电话号+；+联系人
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            DomHead[0]["cdefine14"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["cdefine14"].ToString(); //表头自定义项14，string类型  运输方式
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cinspector"] = ""; //验货人，string类型
            //DomHead[0]["dinspecttime"] = ""; //验货时间，string类型
            //DomHead[0]["cweighter"] = ""; //称重人，string类型
            //DomHead[0]["dweighttime"] = ""; //称重时间，string类型

            //给BO表体参数domBody赋值，此BO参数的业务类型为销售出库单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = 1; //设置BO对象行数
            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义
            for (int iRow = 0; iRow < ds.Tables["T_ProductOutStorageProduct"].DefaultView.Count; iRow++)
            {
                /****************************** 以下是必输字段 ****************************/
                domBody[iRow]["autoid"] = "0"; //主关键字段，int类型
                domBody[iRow]["cinvm_unit"] = "只"; //inventory.cComUnitCode 主计量单位，string类型

                decimal decQty = ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["Quantity"] == DBNull.Value ? 0 : (decimal)ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["Quantity"];
                domBody[iRow]["iquantity"] = Decimal.Round(decQty, 2); //数量，double类型
                domBody[iRow]["cinvcode"] = ds.Tables["T_ProductOutStorageProduct"].DefaultView[iRow]["ProductCode"].ToString(); //存货编码，string类型
                domBody[iRow]["id"] = "0"; //ID，int类型
                domBody[iRow]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型
                domBody[iRow]["cbmemo"] = "CS中间表"; //备注，string类型
                domBody[iRow]["irowno"] = (iRow + 1); //行号，string类型
                //domBody[iRow]["cbinvsn"] = ""; //序列号，string类型
                //domBody[iRow]["cinvouchtype"] = ""; //对应入库单类型，string类型
                //domBody[iRow]["coutvouchid"] = ""; //对应蓝字出库单id，string类型
                //domBody[iRow]["coutvouchtype"] = ""; //对应蓝字出库单类型，string类型
                //domBody[iRow]["isredoutquantity"] = ""; //对应蓝字出库单退回数量，string类型
                //domBody[iRow]["isredoutnum"] = ""; //对应蓝字出库单退回件数，string类型
               
                //domBody[iRow]["idebitids"] = ""; //借入借出单子表id，string类型
                //domBody[iRow]["fsettleqty"] = ""; //累计开票数量，string类型
                //domBody[iRow]["fretqtywkp"] = ""; //未开票退货数量，string类型
                //domBody[iRow]["fretqtyykp"] = ""; //已开票退货数量，string类型
                //domBody[iRow]["cbsysbarcode"] = ""; //单据行条码，string类型
                //domBody[iRow]["strowguid"] = ""; //rowguid，string类型
                //domBody[iRow]["taskguid"] = ""; //taskguid，string类型

                /***************************** 以下是非必输字段 ****************************/
                //domBody[iRow]["cinvaddcode"] = ""; //存货代码，string类型
                //domBody[iRow]["cinvname"] = ""; //存货名称，string类型
                //domBody[iRow]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iRow]["isodid"] = ""; //销售订单子表ID，string类型
                //domBody[iRow]["cbvencode"] = ""; //供应商编码，string类型
                //domBody[iRow]["cvenname"] = ""; //供应商，string类型
                //domBody[iRow]["imassdate"] = ""; //保质期，int类型
                //domBody[iRow]["bgsp"] = ""; //是否质检，int类型
                //domBody[iRow]["cgspstate"] = ""; //检验状态，double类型
                //domBody[iRow]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iRow]["cposname"] = ""; //货位，string类型
                //domBody[iRow]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iRow]["scrapufts"] = ""; //不合格品时间戳，string类型
                //domBody[iRow]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iRow]["cinva_unit"] = ""; //库存单位，string类型
                //domBody[iRow]["csocode"] = ""; //需求跟踪号，string类型
                //domBody[iRow]["cvmivencode"] = ""; //代管商代码，string类型
                //domBody[iRow]["cvmivenname"] = ""; //代管商，string类型
                domBody[iRow]["bvmiused"] = "0"; //代管消耗标识，int类型
                //domBody[iRow]["ivmisettlequantity"] = ""; //代管挂账确认单数量，double类型
                //domBody[iRow]["ivmisettlenum"] = ""; //代管挂账确认单件数，double类型
                //    domBody[iRow]["iinvexchrate"] = "0"; //换算率，double类型
                //domBody[iRow]["cvouchcode"] = ""; //对应入库单id，string类型
                //domBody[iRow]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iRow]["cinvdefine14"] = ""; //存货自定义项14，string类型
                //domBody[iRow]["isoutquantity"] = ""; //累计出库数量，double类型
                //domBody[iRow]["isoutnum"] = ""; //累计出库件数，double类型
                domBody[iRow]["inquantity"] = Decimal.Round(decQty, 2); //应发数量，double类型
                //domBody[iRow]["ipprice"] = ""; //计划金额/售价金额，double类型
                domBody[iRow]["cbdlcode"] = ds.Tables["T_ProductOutStorage"].DefaultView[0]["SerialNum"].ToString(); //发货单号，string类型
                //domBody[iRow]["cdemandmemo"] = ""; //需求分类代号说明，string类型
                //这个对比不到 暂时不填           //domBody[iRow]["iordertype"] = "1"; //销售订单类别，int类型  
                //这个对比不到 暂时不填             //domBody[iRow]["iorderdid"] = "1000017304"; //iorderdid，int类型 
                //这个对比不到 暂时不填           //domBody[iRow]["iordercode"] = "2018040300031"; //销售订单号，string类型 
                //这个对比不到 暂时不填            //domBody[iRow]["iorderseq"] = "1"; //销售订单行号，string类型 
                //这个对比不到 暂时不填            //domBody[iRow]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型 
                //domBody[iRow]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iRow]["dexpirationdate"] = ""; //有效期计算项，string类型
                //domBody[iRow]["cciqbookcode"] = ""; //手册号，string类型
                //domBody[iRow]["ibondedsumqty"] = ""; //累计保税处理抽取数量，string类型
                //domBody[iRow]["strcontractid"] = ""; //合同号，string类型
                //domBody[iRow]["strcode"] = ""; //合同标的编码，string类型
                //domBody[iRow]["ccusinvcode"] = ""; //客户存货编码，string类型
                //domBody[iRow]["ccusinvname"] = ""; //客户存货名称，string类型
                //domBody[iRow]["cbaccounter"] = ""; //记账人，string类型
                domBody[iRow]["bcosting"] = "1"; //是否核算，string类型
                //domBody[iRow]["isotype"] = ""; //需求跟踪方式，int类型
                //domBody[iRow]["stockupid"] = ""; //stockupid，string类型
                //domBody[iRow]["iavaquantity"] = ""; //可用量，double类型
                //domBody[iRow]["iavanum"] = ""; //可用件数，double类型
                //domBody[iRow]["ipresent"] = ""; //现存量，double类型
                //domBody[iRow]["ipresentnum"] = ""; //现存件数，double类型
                //domBody[iRow]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iRow]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iRow]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iRow]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iRow]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iRow]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iRow]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iRow]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iRow]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iRow]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iRow]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iRow]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iRow]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iRow]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iRow]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iRow]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iRow]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iRow]["cbarcode"] = ""; //条形码，string类型
                //domBody[iRow]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iRow]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iRow]["cinvstd"] = ""; //规格型号，string类型
                //domBody[iRow]["cposition"] = ""; //货位编码，string类型
                //domBody[iRow]["creplaceitem"] = ""; //替换件，string类型
                //domBody[iRow]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iRow]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iRow]["cinvdefine3"] = ""; //存货自定义项3，string类型
                //domBody[iRow]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iRow]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iRow]["cdefine27"] = ""; //表体自定义项6，double类型
                //domBody[iRow]["inum"] = ""; //件数，double类型
                //domBody[iRow]["citemcode"] = ""; //项目编码，string类型
                //domBody[iRow]["innum"] = ""; //应发件数，double类型
                //domBody[iRow]["cname"] = ""; //项目，string类型
                //domBody[iRow]["itrids"] = ""; //特殊单据子表标识，double类型
                //domBody[iRow]["citem_class"] = ""; //项目大类编码，string类型
                // domBody[iRow]["idlsid"] = "1000032291"; //DispatchLists. idlsid发货单子表ID，int类型 这个对比不到 暂时不填
                //domBody[iRow]["isbsid"] = ""; //发票子表ID，int类型
                //domBody[iRow]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iRow]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iRow]["isendquantity"] = ""; //发货数量，int类型
                //domBody[iRow]["isendnum"] = ""; //发货件数，int类型
                //domBody[iRow]["citemcname"] = ""; //项目大类名称，string类型
                //domBody[iRow]["iensid"] = ""; //委托子表id，double类型
                //domBody[iRow]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iRow]["cbatchproperty1"] = ""; //属性1，double类型
                //domBody[iRow]["cbatchproperty3"] = ""; //属性3，double类型
                //domBody[iRow]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iRow]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iRow]["cbatchproperty4"] = ""; //属性4，double类型
                //domBody[iRow]["cbatchproperty5"] = ""; //属性5，double类型
                //domBody[iRow]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iRow]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iRow]["cbatchproperty6"] = ""; //属性6，string类型
                //domBody[iRow]["cbatchproperty7"] = ""; //属性7，string类型
                //domBody[iRow]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iRow]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iRow]["cbatchproperty8"] = ""; //属性8，string类型
                //domBody[iRow]["cbatchproperty9"] = ""; //属性9，string类型
                //domBody[iRow]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iRow]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iRow]["cbatchproperty10"] = ""; //属性10，DateTime类型
                //domBody[iRow]["dvdate"] = ""; //失效日期，DateTime类型
                //domBody[iRow]["dmadedate"] = ""; //生产日期，DateTime类型
                domBody[iRow]["cdefine34"] = ds.Tables["T_ProductOutStorageProduct"].DefaultView[0]["SerialID"].ToString(); ; //表体自定义项13，int类型
                //domBody[iRow]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iRow]["impoids"] = ""; //生产订单子表ID，int类型
                //domBody[iRow]["icheckids"] = ""; //检验单子表ID，int类型
                //domBody[iRow]["cbatchproperty2"] = ""; //属性2，double类型
                //domBody[iRow]["cfree2"] = ""; //存货自由项2，string类型
                //domBody[iRow]["iunitcost"] = ""; //单价，double类型
                //domBody[iRow]["iprice"] = ""; //金额，double类型
                //domBody[iRow]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iRow]["cinvdefine16"] = ""; //存货自定义项16，string类型
                //domBody[iRow]["ipunitcost"] = ""; //计划单价/售价，double类型
                //domBody[iRow]["igrossweight"] = ""; //毛重，string类型
                //domBody[iRow]["inetweight"] = ""; //净重，string类型
                //domBody[iRow]["cbatch"] = ""; //批号，string类型
                //domBody[iRow]["iinvsncount"] = ""; //库存序列号，int类型
                //domBody[iRow]["iposflag"] = ""; //是否已分配货位，string类型
            }
            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRet = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                        return strRet;
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRet = "API异常：" + bizEx.Message;
                        //todo:异常处理
                        return strRet;
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRet = "异常原因：" + exReason;
                        return strRet;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRet;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                strRet = "失败！" + errMsgRet;
                return strRet;
            }
            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();

            return strRet;
        }

        #endregion


        #region CS端 U8盘点单生成
        public string CSToU8PanDianDan(string strYongYouDBName, string sAccID, string sYear, string sUserID, string sPassword, string sDate, string sServer, DataSet dsU8)
        {
            // 返回值
            string strRet = "";
            //
            DateTime dtCreateDate = DateTime.Now;
            // DateTime dtCreateDate = Convert.ToDateTime("2015-01-1");
            ////
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            string sSubId = "AS";
            //string sAccID = Custom.UI.Common.YongYouAccID;
            //string sYear = Custom.UI.Common.YongYouYear;
            //string sUserID = Custom.UI.Common.YongYouUserID;
            //string sPassword = Custom.UI.Common.YongYouPassword;
            //string sDate = Custom.UI.Common.YongYouDate;
            //string sServer = "127.0.0.1";// Custom.UI.Common.YongYouServer;
            string sSerial = "";
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }
            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：添加新单据的地址标识为：U8API/checkvouch/Add
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/checkvouch/Add");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：18
            broker.AssignNormalValue("sVouchType", "18");

            //给BO表头参数DomHead赋值，此BO参数的业务类型为盘点单，属表头参数。BO参数均按引用传递
            //提示：给BO表头参数DomHead赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("DomHead", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject DomHead = broker.GetBoParam("DomHead");
            DomHead.RowCount = 1; //设置BO对象(表头)行数，只能为一行
            //给BO对象(表头)的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            /****************************** 以下是必输字段 ****************************/
            DomHead[0]["id"] = "0"; //主关键字段，int类型
            DomHead[0]["ccvcode"] = "0000000001"; //盘点单号，string类型
            DomHead[0]["dcvdate"] = dtCreateDate.ToString("yyyy-MM-dd"); //盘点日期，DateTime类型
            DomHead[0]["dacdate"] = dtCreateDate.ToString("yyyy-MM-dd");//账面日期，DateTime类型
            DomHead[0]["cwhname"] = dsU8.Tables["T_PDStorage"].DefaultView[0]["PDcWhName"].ToString(); //盘点仓库，string类型

            /***************************** 以下是非必输字段 ****************************/
            //DomHead[0]["cmodifyperson"] = ""; //修改人，string类型
            //DomHead[0]["dmodifydate"] = ""; //修改日期，DateTime类型
            //DomHead[0]["dnmaketime"] = ""; //制单时间，DateTime类型
            //DomHead[0]["dnmodifytime"] = ""; //修改时间，DateTime类型
            //DomHead[0]["dnverifytime"] = ""; //审核时间，DateTime类型
            //DomHead[0]["dveridate"] = ""; //审核日期，DateTime类型
            //DomHead[0]["ccvperiod"] = ""; //盘点会计期间，string类型
            DomHead[0]["bposcheck"] = "0"; //是否货位明细盘点，int类型
            DomHead[0]["ireturncount"] = "0"; //ireturncount，string类型
            DomHead[0]["iverifystate"] = "0"; //iverifystate，string类型
            DomHead[0]["iswfcontrolled"] = "0"; //iswfcontrolled，string类型
            //DomHead[0]["crdname_1"] = ""; //出库类别，string类型
            //DomHead[0]["crdname"] = ""; //入库类别，string类型
            //DomHead[0]["cdepname"] = ""; //部门，string类型
            //DomHead[0]["cpersonname"] = ""; //经手人，string类型
            DomHead[0]["ccvmemo"] = "PDA中间表"; //备注，string类型
            DomHead[0]["cmaker"] = dsU8.Tables[0].DefaultView[0]["CreaterName"].ToString(); ; //制单人，string类型
            //DomHead[0]["caccounter"] = ""; //审核人，string类型
            DomHead[0]["csource"] = "1"; //单据来源，int类型
            DomHead[0]["ccvtype"] = "普通仓库盘点"; //盘点类型，string类型
            //DomHead[0]["ufts"] = ""; //时间戳，string类型
            DomHead[0]["cposition"] = ""; //货位编码，string类型
            //DomHead[0]["ccvbatch"] = ""; //盘点批号，string类型
            DomHead[0]["cirdcode"] = "105"; //入库类别编码，string类型
            //DomHead[0]["isafesum"] = ""; //安全库存量，string类型
            //DomHead[0]["ilowsum"] = ""; //最低库存量，string类型
            //DomHead[0]["itopsum"] = ""; //最高库存量，string类型
            //DomHead[0]["cpersoncode"] = ""; //经手人编码，string类型
            DomHead[0]["cwhcode"] = dsU8.Tables["T_PDStorage"].DefaultView[0]["PDcWhCode"].ToString(); //盘点仓库编码，string类型
            //DomHead[0]["cdepcode"] = ""; //部门编号，string类型
            DomHead[0]["cordcode"] = "206"; //出库类别编码，string类型
            //DomHead[0]["cposname"] = ""; //货位，string类型
            DomHead[0]["vt_id"] = "29"; //单据模版号，int类型
            DomHead[0]["btransflag"] = "0"; //是否传递，string类型
            //DomHead[0]["iavaquantity"] = ""; //可用量，string类型
            //DomHead[0]["iavanum"] = ""; //可用件数，string类型
            //DomHead[0]["ipresentnum"] = ""; //现存件数，string类型
            //DomHead[0]["ipresent"] = ""; //现存量，string类型
            //DomHead[0]["cdefine1"] = ""; //表头自定义项1，string类型
            //DomHead[0]["cdefine2"] = ""; //表头自定义项2，string类型
            //DomHead[0]["cdefine3"] = ""; //表头自定义项3，string类型
            //DomHead[0]["cdefine4"] = ""; //表头自定义项4，DateTime类型
            //DomHead[0]["cdefine5"] = ""; //表头自定义项5，int类型
            //DomHead[0]["cdefine6"] = ""; //表头自定义项6，DateTime类型
            //DomHead[0]["cdefine7"] = ""; //表头自定义项7，double类型
            //DomHead[0]["cdefine8"] = ""; //表头自定义项8，string类型
            //DomHead[0]["cdefine9"] = ""; //表头自定义项9，string类型
            DomHead[0]["cdefine10"] = dsU8.Tables["T_PDStorage"].DefaultView[0]["SerialNum"].ToString(); ; //表头自定义项10，string类型
            //DomHead[0]["cdefine11"] = ""; //表头自定义项11，string类型
            //DomHead[0]["cdefine12"] = ""; //表头自定义项12，string类型
            //DomHead[0]["cdefine13"] = ""; //表头自定义项13，string类型
            //DomHead[0]["cdefine14"] = ""; //表头自定义项14，string类型
            //DomHead[0]["cdefine15"] = ""; //表头自定义项15，int类型
            //DomHead[0]["cdefine16"] = ""; //表头自定义项16，double类型

            //给BO表体参数domBody赋值，此BO参数的业务类型为盘点单，属表体参数。BO参数均按引用传递
            //提示：给BO表体参数domBody赋值有两种方法

            //方法一是直接传入MSXML2.DOMDocumentClass对象
            //broker.AssignNormalValue("domBody", new MSXML2.DOMDocumentClass())

            //方法二是构造BusinessObject对象，具体方法如下：
            BusinessObject domBody = broker.GetBoParam("domBody");
            domBody.RowCount = 1; //设置BO对象行数

            domBody.RowCount = dsU8.Tables["T_PDStorageToU8"].DefaultView.Count; //设置BO对象行数

            //可以自由设置BO对象行数为大于零的整数，也可以不设置而自动增加行数
            //给BO对象的字段赋值，值可以是真实类型，也可以是无类型字符串
            //以下代码示例只设置第一行值。各字段定义详见API服务接口定义

            for (int iToU8 = 0; iToU8 < dsU8.Tables["T_PDStorageToU8"].DefaultView.Count; iToU8++)
            {
                /****************************** 以下是必输字段 ****************************/
                domBody[iToU8]["autoid"] = "0"; //主关键字段，int类型
                domBody[iToU8]["cinvcode"] = dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["cInvCode"].ToString(); //存货编码，string类型
                domBody[iToU8]["editprop"] = "A"; //编辑属性：A表新增，M表修改，D表删除，string类型

                /***************************** 以下是非必输字段 ****************************/
                // domBody[iToU8]["isodid"] = ""; //销售订单子表ID，string类型
                // domBody[iToU8]["cbvencode"] = ""; //供应商编码，string类型
                // domBody[iToU8]["cvenname"] = ""; //供应商，string类型
                // domBody[iToU8]["imassdate"] = ""; //保质期，int类型
                //domBody[iToU8]["cassunit"] = ""; //库存单位码，string类型
                //domBody[iToU8]["dmadedate"] = ""; //生产日期，DateTime类型
                //domBody[iToU8]["corufts"] = ""; //对应单据时间戳，string类型
                //domBody[iToU8]["icvjustnum"] = ""; //账面调节件数，double类型
                //domBody[iToU8]["icvjustquantity"] = ""; //账面调节数量，double类型
                //domBody[iToU8]["cinvaddcode"] = ""; //存货代码，string类型
                //domBody[iToU8]["cmassunit"] = ""; //保质期单位，int类型
                //domBody[iToU8]["csocode"] = ""; //需求跟踪号，string类型
                domBody[iToU8]["cposname"] = dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["YYPDcPostionName"].ToString(); //货位，string类型


                //domBody[iToU8]["cvmivencode"] = ""; //代管商代码，string类型
                //domBody[iToU8]["cvmivenname"] = ""; //代管商，string类型
                domBody[iToU8]["cinvname"] = dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["cInvName"].ToString(); //存货名称，string类型
                domBody[iToU8]["cinvstd"] = dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["cPackingType"].ToString(); //规格型号，string类型
                //domBody[iToU8]["cfree1"] = ""; //存货自由项1，string类型
                //domBody[iToU8]["cfree3"] = ""; //存货自由项3，string类型
                //domBody[iToU8]["cfree4"] = ""; //存货自由项4，string类型
                //domBody[iToU8]["cfree5"] = ""; //存货自由项5，string类型
                //domBody[iToU8]["cfree6"] = ""; //存货自由项6，string类型
                //domBody[iToU8]["cfree7"] = ""; //存货自由项7，string类型
                //domBody[iToU8]["cfree8"] = ""; //存货自由项8，string类型
                //domBody[iToU8]["cfree9"] = ""; //存货自由项9，string类型
                //domBody[iToU8]["cfree10"] = ""; //存货自由项10，string类型
                //domBody[iToU8]["cfree2"] = ""; //存货自由项2，string类型
                //domBody[iToU8]["cdemandmemo"] = ""; //需求分类代号说明，string类型
                domBody[iToU8]["iexpiratdatecalcu"] = "0"; //有效期推算方式，int类型
                //domBody[iToU8]["cexpirationdate"] = ""; //有效期至，string类型
                //domBody[iToU8]["dexpirationdate"] = ""; //有效期计算项，string类型
                domBody[iToU8]["ccvbatch"] = dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["cCVBatch"].ToString(); //批号，string类型
                //domBody[iToU8]["isoseq"] = ""; //需求跟踪行号，string类型
                //domBody[iToU8]["isotype"] = ""; //需求跟踪方式，int类型
                //domBody[iToU8]["cinvm_unit"] = ""; //主计量单位，string类型
                //sqg    domBody[iToU8]["iinvexchrate"] = "0"; //换算率，double类型
                //sqg  domBody[iToU8]["icvnum"] = "0"; //账面件数，double类型
                //sqg    domBody[iToU8]["iadinquantity"] = "0"; //调整入库数量，double类型
                //sqg    domBody[iToU8]["iadinnum"] = "0"; //调整入库件数，double类型
                //sqg   domBody[iToU8]["iadoutquantity"] = "0"; //调整出库数量，double类型
                //sqg  domBody[iToU8]["iadoutnum"] = "0"; //调整出库件数，double类型
                //domBody[iToU8]["iallowwaste"] = ""; //合理损耗率，double类型
                //domBody[iToU8]["iactualwaste"] = ""; //实际损耗率，double类型

                decimal deciCVQuantity = dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["iCVQuantity"] == DBNull.Value ? 0 : Convert.ToDecimal(dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["iCVQuantity"].ToString());

                domBody[iToU8]["icvquantity"] = deciCVQuantity.ToString("###,###,##0.00"); //账面数量，double类型
                //domBody[iToU8]["cinvdefine13"] = ""; //存货自定义项13，string类型
                //domBody[iToU8]["cinvdefine14"] = ""; //存货自定义项14，string类型
                domBody[iToU8]["icvcnum"] = "0"; //盘点件数，double类型
                //domBody[iToU8]["cinva_unit"] = ""; //库存单位，string类型
                decimal deciCVCQuantity = dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["iCVCQuantity"] == DBNull.Value ? 0 : Convert.ToDecimal(dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["iCVCQuantity"].ToString());
                domBody[iToU8]["icvcquantity"] = deciCVCQuantity.ToString("###,###,##0.00"); //盘点数量，double类型
                //domBody[iToU8]["ykjs"] = ""; //盈亏件数，double类型
                //domBody[iToU8]["yksl"] = ""; //盈亏数量，double类型
                //domBody[iToU8]["cdefine22"] = ""; //表体自定义项1，string类型
                //domBody[iToU8]["cdefine28"] = ""; //表体自定义项7，string类型
                //domBody[iToU8]["cdefine29"] = ""; //表体自定义项8，string类型
                //domBody[iToU8]["cdefine30"] = ""; //表体自定义项9，string类型
                //domBody[iToU8]["cdefine31"] = ""; //表体自定义项10，string类型
                //domBody[iToU8]["cdefine32"] = ""; //表体自定义项11，string类型
                //domBody[iToU8]["cdefine33"] = ""; //表体自定义项12，string类型
                //domBody[iToU8]["cinvdefine4"] = ""; //存货自定义项4，string类型
                //domBody[iToU8]["cinvdefine5"] = ""; //存货自定义项5，string类型
                //domBody[iToU8]["cinvdefine6"] = ""; //存货自定义项6，string类型
                //domBody[iToU8]["cinvdefine7"] = ""; //存货自定义项7，string类型
                //domBody[iToU8]["cinvdefine8"] = ""; //存货自定义项8，string类型
                //domBody[iToU8]["cinvdefine9"] = ""; //存货自定义项9，string类型
                //domBody[iToU8]["cinvdefine10"] = ""; //存货自定义项10，string类型
                //domBody[iToU8]["cinvdefine11"] = ""; //存货自定义项11，string类型
                //domBody[iToU8]["cinvdefine12"] = ""; //存货自定义项12，string类型
                //domBody[iToU8]["ijhdj"] = ""; //单价，double类型
                //domBody[iToU8]["cdefine23"] = ""; //表体自定义项2，string类型
                //domBody[iToU8]["ijhje"] = ""; //账面金额，double类型
                //domBody[iToU8]["ccvreason"] = ""; //原因，string类型
                //domBody[iToU8]["cdefine24"] = ""; //表体自定义项3，string类型
                //domBody[iToU8]["isjdj"] = ""; //盘点金额，double类型
                //domBody[iToU8]["cdefine25"] = ""; //表体自定义项4，string类型
                //domBody[iToU8]["isjje"] = ""; //盈亏金额，double类型
                //domBody[iToU8]["ccvcode"] = ""; //盘点单号，string类型
                //domBody[iToU8]["cdefine26"] = ""; //表体自定义项5，double类型
                //domBody[iToU8]["cbarcode"] = ""; //条形码，string类型
                //domBody[iToU8]["cinvouchcode"] = ""; //对应入库单号，string类型
                //domBody[iToU8]["cdefine27"] = ""; //表体自定义项6，double类型
                //domBody[iToU8]["rdsid"] = ""; //对应入库单id，int类型
                //domBody[iToU8]["citemcode"] = ""; //项目编码，string类型
                domBody[iToU8]["cdefine34"] = dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["SerialID"].ToString(); //表体自定义项13，int类型
                //domBody[iToU8]["cdefine35"] = ""; //表体自定义项14，int类型
                //domBody[iToU8]["cname"] = ""; //项目，string类型
                //domBody[iToU8]["ddisdate"] = ""; //失效日期，DateTime类型
                //domBody[iToU8]["citem_class"] = ""; //项目大类编码，string类型
                //domBody[iToU8]["cdefine36"] = ""; //表体自定义项15，DateTime类型
                //domBody[iToU8]["cdefine37"] = ""; //表体自定义项16，DateTime类型
                //domBody[iToU8]["cinvdefine15"] = ""; //存货自定义项15，string类型
                //domBody[iToU8]["cinvdefine16"] = ""; //存货自定义项16，string类型
                //domBody[iToU8]["citemcname"] = ""; //项目大类名称，string类型
                domBody[iToU8]["cposition"] = dsU8.Tables["T_PDStorageToU8"].DefaultView[iToU8]["YYPDcPostionCode"].ToString(); //货位编码，string类型
                //domBody[iToU8]["creplaceitem"] = ""; //替换件，string类型
                //domBody[iToU8]["cinvdefine1"] = ""; //存货自定义项1，string类型
                //domBody[iToU8]["cinvdefine2"] = ""; //存货自定义项2，string类型
                //domBody[iToU8]["cinvdefine3"] = ""; //存货自定义项3，string类型
            }
            //给普通参数domPosition赋值。此参数的数据类型为System.Object，此参数按引用传递，表示货位：传空
            //broker.AssignNormalValue("domPosition", new System.Object());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象,如果由调用方控制事务，则需要设置此连接对象，否则传空
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String，此参数按值传递。在API调用返回时，可以通过GetResult("VouchId")获取其值
            string strVouchId = "";
            broker.AssignNormalValue("VouchId", strVouchId);

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);


            LogWritMsg(domBody.ToString());
            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量。
            broker.AssignNormalValue("bCheck", false);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", false);

            //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否红字单据
            broker.AssignNormalValue("bIsRedVouch", false);

            //给普通参数sAddedState赋值。此参数的数据类型为System.String，此参数按值传递，表示传空字符串
            broker.AssignNormalValue("sAddedState", "");

            //给普通参数bReMote赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否远程：转入false
            broker.AssignNormalValue("bReMote", false);

            //第六步：调用API
            if (!broker.Invoke())
            {
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strRet = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strRet = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strRet = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strRet;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true:成功,false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                strRet = "失败！" + errMsgRet;
                return strRet;
            }
            //获取out/inout参数值

            //获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

            //获取普通INOUT参数VouchId。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
            System.String VouchIdRet = broker.GetResult("VouchId") as System.String;

            //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
            //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

            //结束本次调用，释放API资源
            broker.Release();
            return strRet;
        }

        private static void LogWritMsg(string strmsg)
        {
            //D:\中天PDA接口\bin
            new Log().LogWrite("D:/中天PDA接口/Logs/201901081632.log", strmsg);
        }

        #endregion

        /// <summary>
        /// 分割仓库或者货位等  格式如 (编码)名称 的字符串 0 是获取编码 其他为获取名称
        /// </summary>
        /// <param name="strName">字符串</param>
        /// <param name="strType">类型 0 是获取编码 其他为获取名称</param>
        /// <returns></returns>
        private string GetwhOrPoCodeAndName(string strName, int iType)
        {
            string strCutString = strName;
            string strCustStringName = string.Empty;
            string strCustStringCode = string.Empty;
            //货位
            if (strCutString == string.Empty)
            {
                return "";
            }
            int iStartIndex = strCutString.IndexOf('(');
            int iEndIndex = strCutString.IndexOf(')');
            if (iStartIndex >= 0 && iEndIndex > 0 && iEndIndex > iStartIndex)
            {
                strCustStringCode = strCutString.Substring(iStartIndex + 1, iEndIndex - iStartIndex - 1);
                strCustStringName = strCutString.Substring(iEndIndex + 1, strCutString.Length - iEndIndex - 1);
            }
            else
            {
                strCustStringCode = "";
                strCustStringName = "";
            }
            if (iType == 0)
                return strCustStringCode;
            else
                return strCustStringName;
        }

        public string CKCLAuditAPI(string strYongYouDBName, string strAccID, string strYear, string strUserID, string strPassword, string strDate, string strServer, DataSet dsU8)
        {
            DateTime dtCreateDate = Convert.ToDateTime(strDate);
            string sSubId = "AS";
            string sAccID = strAccID;
            string sYear = strYear;
            string sUserID = strUserID;
            string sPassword = strPassword;
            string sDate = strDate;
            string sServer = strServer;
            string sSerial = "";

            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/MaterialOut/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/MaterialOut/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：11
            broker.AssignNormalValue("sVouchType", "11");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", dsU8.Tables[0].DefaultView[0]["ID"].ToString());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", dsU8.Tables[0].DefaultView[0]["ufts1"].ToString());

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            //给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            //给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            //给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());


            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());

            //获取普通返回值。此返回值数据类型为System.String，此参数按值传递，表示成功返回空串
            System.String resultMsg = broker.GetResult("errMsg") as System.String;
            if (result == false)
            {
                //结束本次调用，释放API资源
                broker.Release();
                return resultMsg;
            }
            //结束本次调用，释放API资源
            broker.Release();
            return "";
        }
        public string CKXSAuditAPI(string strYongYouDBName, string strAccID, string strYear, string strUserID, string strPassword, string strDate, string strServer, DataSet dsU8)
        {
            DateTime dtCreateDate = Convert.ToDateTime(strDate);
            string sSubId = "AS";
            string sAccID = strAccID;
            string sYear = strYear;
            string sUserID = strUserID;
            string sPassword = strPassword;
            string sDate = strDate;
            string sServer = strServer;
            string sSerial = "";

            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/saleout/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/saleout/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值
            long ID = (long)dsU8.Tables[0].DefaultView[0]["ID"];

            //给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：32
            broker.AssignNormalValue("sVouchType", "32");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", ID.ToString());

            //该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            //broker.AssignNormalValue("cnnFrom", new ADODB.Connection());

            //给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", dsU8.Tables[0].DefaultView[0]["ufts1"].ToString());

            //该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            //给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            //给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            //给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());


            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExMessage = "调用U8的API出错！";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExMessage = "系统异常：" + sysEx.Message;
                        //todo:异常处理
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExMessage = "API异常：" + bizEx.Message;
                        //todo:异常处理
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExMessage = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExMessage;
            }

            //第七步：获取返回结果
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());

            //获取普通返回值。此返回值数据类型为System.String，此参数按值传递，表示成功返回空串
            System.String resultMsg = broker.GetResult("errMsg") as System.String;
            if (result == false)
            {
                //结束本次调用，释放API资源
                broker.Release();
                return resultMsg;
            }
            //结束本次调用，释放API资源
            broker.Release();
            return "";
        }
        public string CKDBAuditAPI(string strYongYouDBName, string strAccID, string strYear, string strUserID, string strPassword, string strDate, string strServer, DataSet dsU8)
        {
            DateTime dtCreateDate = Convert.ToDateTime("2015-01-31");
            string sSubId = "AS";
            string sAccID = strAccID;
            string sYear = strYear;
            string sUserID = strUserID;
            string sPassword = strPassword;
            string sDate = strDate;
            string sServer = strServer;
            string sSerial = "";

            //
            //第一步：构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
            //如果当前环境中有login对象则可以省去第一步
            U8Login.clsLogin u8Login = new U8Login.clsLogin();
            if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial))
            {
                string strRet = "登陆失败，原因：" + u8Login.ShareString;
                Marshal.FinalReleaseComObject(u8Login);
                return strRet;
            }

            //第二步：构造环境上下文对象，传入login，并按需设置其它上下文参数
            U8EnvContext envContext = new U8EnvContext();
            envContext.U8Login = u8Login;

            //第三步：设置API地址标识(Url)
            //当前API：审核单据的地址标识为：U8API/TransVouch/Audit
            U8ApiAddress myApiAddress = new U8ApiAddress("U8API/TransVouch/Audit");

            //第四步：构造APIBroker
            U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext);

            //第五步：API参数赋值

            ////给普通参数sVouchType赋值。此参数的数据类型为System.String，此参数按值传递，表示单据类型：12
            broker.AssignNormalValue("sVouchType", "12");

            //给普通参数VouchId赋值。此参数的数据类型为System.String，此参数按值传递，表示单据Id
            broker.AssignNormalValue("VouchId", dsU8.Tables[0].DefaultView[0]["ID"].ToString());

            ////该参数errMsg为OUT型参数，由于其数据类型为System.String，为一般值类型，因此不必传入一个参数变量。在API调用返回时，可以通过GetResult("errMsg")获取其值

            ////给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection，此参数按引用传递，表示连接对象：调用方控制事务时需要传入连接对象
            //broker.AssignNormalValue("cnnFrom",null);// new ADODB.Connection());

            ////给普通参数TimeStamp赋值。此参数的数据类型为System.Object，此参数按值传递，表示单据时间戳，用于检查单据是否修改，空串时不检查
            broker.AssignNormalValue("TimeStamp", dsU8.Tables[0].DefaultView[0]["ufts1"].ToString());

            ////该参数domMsg为OUT型参数，由于其数据类型为MSXML2.IXMLDOMDocument2，非一般值类型，因此必须传入一个参数变量。在API调用返回时，可以直接使用该参数
            MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument();
            broker.AssignNormalValue("domMsg", domMsg);

            //给普通参数bCheck赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示是否控制可用量
            broker.AssignNormalValue("bCheck", true);

            //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示检查可用量
            broker.AssignNormalValue("bBeforCheckStock", true);

            //给普通参数bList赋值。此参数的数据类型为System.Boolean，此参数按值传递，表示传入空串
            broker.AssignNormalValue("bList", false);

            ////给普通参数MakeWheres赋值。此参数的数据类型为VBA.Collection，此参数按值传递，表示传空
            //broker.AssignNormalValue("MakeWheres", new VBA.Collection());

            ////给普通参数sWebXml赋值。此参数的数据类型为System.String，此参数按值传递，表示传入空串
            //broker.AssignNormalValue("sWebXml", new System.String());

            ////给普通参数oGenVouchIds赋值。此参数的数据类型为Scripting.IDictionary，此参数按值传递，表示返回审核时自动生成的单据的id列表,传空
            //broker.AssignNormalValue("oGenVouchIds", new Scripting.IDictionary());

            //第六步：调用API
            if (!broker.Invoke())
            {
                string strExceptionMsg = "";
                //错误处理
                Exception apiEx = broker.GetException();
                if (apiEx != null)
                {
                    if (apiEx is MomSysException)
                    {
                        MomSysException sysEx = apiEx as MomSysException;
                        strExceptionMsg = "系统异常：" + sysEx.Message;
                    }
                    else if (apiEx is MomBizException)
                    {
                        MomBizException bizEx = apiEx as MomBizException;
                        strExceptionMsg = "API异常：" + bizEx.Message;
                    }
                    //异常原因
                    String exReason = broker.GetExceptionString();
                    if (exReason.Length != 0)
                    {
                        strExceptionMsg = "异常原因：" + exReason;
                    }
                }
                //结束本次调用，释放API资源
                broker.Release();
                return strExceptionMsg;
            }

            //第七步：获取返回结果

            //获取返回值
            //获取普通返回值。此返回值数据类型为System.Boolean，此参数按值传递，表示返回值:true,成功;false:失败
            System.Boolean result = Convert.ToBoolean(broker.GetReturnValue());
            if (result == false)
            {
                System.String errMsgRet = broker.GetResult("errMsg") as System.String;
                broker.Release();
                return errMsgRet;
                //获取out/inout参数值

                ////获取普通OUT参数errMsg。此返回值数据类型为System.String，在使用该参数之前，请判断是否为空
                //System.String errMsgRet = broker.GetResult("errMsg") as System.String;

                ////获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2，在使用该参数之前，请判断是否为空
                //MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg"));

                //结束本次调用，释放API资源

            }
            broker.Release();
            return "";
        }
    }
}
